Necesito grep en un grupo de archivos (algunos comprimidos, otros no) para un patrón en particular. Sé que zgrep se puede usar para grep en archivos comprimidos, pero el script que se está ejecutando se basa en códigos de retorno con una lógica diferente para los códigos de retorno 0, 1 y cualquier otra cosa.

Estados grep: el estado de salida es 0 si se encuentran las líneas seleccionadas y 1 en caso contrario. 2 si se produjo un error.

Zgrep afirma que funciona igual que grep, pero puede manejar archivos comprimidos.

Sin embargo con 2 archivos:

#test1
hello

Y

#test2
goodbye

Ambos en el mismo directorio

grep "hello" * devuelve 0 como se esperaba porque el patrón se encuentra en test1

zgrep "hello" * sin embargo devuelve 1 aunque el patrón se encontró en test1. devuelve 1 porque el patrón no se encontró en test2. resulta que si algún archivo no coincide con el patrón, se devuelve 1, incluso si todos los demás archivos coinciden con el patrón.

En mi caso, solo me importa si al menos 1 archivo coincide o si ningún archivo coincide. si algunos lo hacen y otros no, eso debería contar como un éxito.

Entonces, ¿hay alguna manera de que pueda grep en archivos comprimidos y descomprimidos sin zgrep y obtener códigos de retorno adecuados ya que zgrep parece tener errores?

Versión grep: 2.20

Versión zgrep: 1.5

Nota: no hay forma de que yo, ni siquiera un administrador del sistema, cambie estos números de versión sin un proceso de aprobación de meses, así que evite soluciones como "actualice sus cosas"

3
backcab 20 feb. 2018 a las 18:31

2 respuestas

La mejor respuesta

Esto parece ser un error en zgrep. Prueba xzgrep.

$ xzgrep -q hello *; echo $?
0
$ zgrep -q hello *;echo $?
1
$ grep -q hello *;echo $?
0

También puede usar zcat y grep juntos, si los archivos siempre son gzipped.

$ zcat * | grep -q hello; echo $?
2
iamauser 20 feb. 2018 a las 16:01
zgrep -m1 -c "a23215" /var/log/syslog.*.gz | egrep -v ":0$" && echo hit || echo miss

Me muestra 'señorita',

zgrep -m1 -c "23215" /var/log/syslog.*.gz | egrep -v ":0$" && echo hit || echo miss

Mientras que esto muestra 'hit', ya que 2 de 7 archivos coincidieron.

Mas general:

zgrep -m1 -c "PATTERN" /path/FILEPATTERN* | egrep -q -v ":0$" && echo 1 || echo 0

Simplemente devolverá 0 o 1, sin los nombres de archivo, que coinciden.

1
user unknown 20 feb. 2018 a las 16:12