2011-02-14 20 views
5

estoy usando el siguiente comando awk en un script de esperar para obtener la puerta de entrada para un destino en particularalternativa a awk

route | grep $dest | awk '{print $2}' 

Sin embargo, la espera de la escritura no le gusta el $ 2 en la declaración anterior.

¿Alguien sabe de una alternativa a awk para realizar la misma función que la anterior? es decir. salida segunda columna.

+2

nunca se debe utilizar variables como '$ dest' en un shell sin escapar de ellos. ¡Usa 'grep" $ dest "' en su lugar! Dejarlas sin comillas es solo cuando desee que el espacio en blanco de su variable se interprete como un delimitador de argumento real. – Benoit

+0

¿Funciona si escapas del signo de dólar? –

Respuesta

4

Puede utilizar corte:

route | grep $dest | cut -d \ -f 2 

que utiliza espacios como delimitador de campo y saca el segundo campo

+2

Esto usará espacios como delimitadores, pero si hay múltiples espacios habrá un campo para cada espacio. Sería mejor utilizar sed antes para eliminar espacios duplicados. –

+0

Esto ha funcionado. Solo para cualquiera interesado en el comando 'ruta | grep $ dest' dio la salida '10.21.1.1 10.12.1.1 255.255.255.255 UGH 2 0 0 ath1' (enrutamiento realizado a través de olsr en red de malla inalámbrica para cualquier persona interesada). He utilizado con éxito lo siguiente para extraer la segunda columna de esto, en un script de espera. 'ruta | grep 10.21.1.1 | sed-e 's/[] *// g' | cut -d \ -f 3' – jmac

+1

Mucho más delgado que 'sed' es' tr': 'ruta | grep 10.21.1.1 | tr -s \ | corte -d \ -f 3'. Pero he votado a favor la respuesta que menciona 'awk', porque esa es realmente la mejor alternativa aquí. :) – cassianoleal

0

Dependiendo de la estructura de sus datos, puede usar corte o usar sed para filtrar e imprimir la segunda columna.

1

Antes de cambiar a otra utilidad, comprobar si el cambio de worrks Separador de campo. Documentación para separadores de campo en GNU Awk here.

1

SED es la mejor alternativa para usar. Si no te importa una dependencia, Perl también debe ser suficiente para resolver la tarea

0

Como alternativa, se puede usar Perl:

perl -ne 'if(/foo/) { @_ = split(/:/); print $_[1]; }' 

Esto imprimirá segunda muestra de cada línea que contiene foo, con : como separador de fichas

+0

¿Cómo uso esto? No parece leer de STDIN. –

4

Para responder a su pregunta de Esperar, las comillas simples no tienen un significado especial para el analizador Tcl. Es necesario utilizar los frenos para proteger el cuerpo del script awk:

route | grep $dest | awk {{print $2}} 

Y como awk puede hacer lo que hace grep, puede salirse con uno menos proceso:

route | awk -v d=$dest {$0 ~ d {print $2}}