2011-05-26 12 views
6

estoy tubería alguna salida de un comando a egrep, que estoy usando para asegurarse de que una cadena de fallos en particular no aparece en.grep muestran todas las líneas, no sólo de los partidos, establecer el código de salida

El el comando en sí, desafortunadamente, no devolverá un estado de salida distinto de cero cuando falla, por eso estoy haciendo esto.

command | egrep -i -v "badpattern" 

Esto funciona por lo que me da el código de salida que quiero (1 si badpattern aparece en la salida, 0 en caso contrario), pero, que va sólo las líneas de salida que no coinciden con el patrón (como el -v switch fue diseñado para hacer). Para mis necesidades, esas líneas son las líneas más interesantes.

¿Hay alguna forma de que grep pase ciegamente por todas las líneas que recibe como entrada, y solo dame el código de salida según corresponda?

Si no, estaba pensando que podría usar perl -ne "print; exit 1 if/badpattern /". Uso -n en lugar de -p porque -p no imprimirá la línea ofensiva (ya que imprime después de ejecutando el un-liner). Por lo tanto, usar -n y llame print mí mismo, que al menos me da la primera línea en cuestión, pero entonces la salida (y ejecución) se detiene allí, así que tendría que hacer algo como

perl -e '$code = 0; while (<>) { print; $code = 1 if /badpattern/; } exit $code'

cuales hace todo el trato, pero es un poco demasiado, ¿hay un simple cambio de línea de comando para grep que simplemente hará lo que estoy buscando?

Respuesta

4

En realidad, su idea Perl no es malo. Trato:

perl -pe 'END { exit $status } $status=1 if /badpattern/;' 

Apuesto a que esto es por lo menos tan rápido como se sugirieron las otras opciones.

+0

Fresco, más corto que mi forro Perl One, también, al menos. – hsiu

1

¿Qué tal si hacemos un redireccionamiento a/dev/null, eliminando todas las líneas, pero todavía obtienes el código de salida?

$ grep spam .bashrc > /dev/null 

$ echo $? 
1 

$ grep alias .bashrc > /dev/null 

$ echo $? 
0 

O puede simplemente usar el interruptor -q

-q, --quiet, --silent 
      Quiet; do not write anything to standard output. Exit 
      immediately with zero status if any match is found, even if an 
      error was detected. Also see the -s or --no-messages option. 
      (-q is specified by POSIX.) 
+0

Pero yo _do_ desea ver todas las líneas. No quiero filtrar las líneas, solo quiero escanearlas y si hay una coincidencia, configure el código de salida como distinto de cero. Pero todas las líneas deberían salir independientemente. – hsiu

+0

No entendió su Q por completo, si conoce la longitud de la salida puede hacer algo como esto 'grep alias -A1000 -B1000' es decir, mostrar 1k líneas arriba y abajo coinciden, es decir, todas las salidas –

2
$ tee /dev/tty < ~/.bashrc | grep -q spam && echo spam || echo no spam 
+0

Entonces, la última parte es innecesaria, pero el la primera parte funciona ... a veces. No entiendo esto, pero si hago un echo badpattern | tee/dev/tty | grep -q -v badpattern, funciona. PERO, si pongo "badpattern" en un archivo con algunas otras cosas y hago cat bpfile | tee/dev/tty | grep -q -v badpattern, deja de funcionar, el estado de salida siempre regresa 0. Entonces, difícil para mí saber si funcionará para lo que obtengo de curl (el primer comando que estoy usando) o no. – hsiu

Cuestiones relacionadas