2009-08-10 8 views
40

Mi problema actual es que tengo alrededor de 10 carpetas, que contienen archivos comprimidos (alrededor de un promedio de 5 cada uno). Esto hace que sean 50 archivos para abrir y mirar.encontrar cadena dentro de un archivo comprimido en una carpeta

¿Existe un método más simple para averiguar si un archivo comprimido en una carpeta tiene un patrón en particular o no?

zcat ABC/myzippedfile1.txt.gz | grep "pattern match" 
zcat ABC/myzippedfile2.txt.gz | grep "pattern match" 

En lugar de escribir un guión, puedo hacer lo mismo en una sola línea, para todas las carpetas y subcarpetas?

for f in `ls *.gz`; do echo $f; zcat $f | grep <pattern>; done; 

Respuesta

47

zgrep se verá en ficheros comprimidos, tiene una opción -R recursiva, y una -H me muestran la opción de nombre de archivo:

zgrep -R --include=*.gz -H "pattern match" . 
+12

FWIW, mi zgrep no es compatible con -R – ZombieDev

+0

@Ned Batchelder, gracias por dar una dirección. Pero para mí, después de las opciones trabajadas zgrep "patrón" archivos – hiren

+0

'zgrep -R --include = \ *. Gz -H" patrón "' en zsh – blacktooth

7

utilizar el comando Buscar

find . -name "*.gz" -exec zcat "{}" + |grep "test" 

o intente utilizar la opción recursiva (r) de zcat

+0

-bash-3.00 $ encontrar. -name "* .gz" -exec zcat "{}" + | grep "NO OK" encontrar: falta un argumento para '-exec ' parece que falta algo después de la ejecución? – gagneet

+0

me funciona. – ghostdog74

+0

quizás intente cambiar para encontrar ... +; | grep ... y vea – ghostdog74

18

No es necesario zcat aquí porque no es zgrep y zegrep.

Si desea ejecutar un comando a través de una jerarquía de directorios, se utiliza hallazgo:

find . -name "*.gz" -exec zgrep ⟨pattern⟩ \{\} \; 

Y también “ls *.gz” es inútil en para y que sólo debe utilizar “* .gz " en el futuro.

+0

Obtengo las líneas que contienen este patrón, pero no el nombre del archivo por este método. ¿Hay alguna manera de obtener eso también en la lista? – gagneet

+2

'encontrar. -name '* .gz' -print0 | xargs -0 zgrep pattern'? – Hasturkun

+2

Old grep trick: find. -name "* .gz" -exec zgrep ⟨pattern⟩/dev/null \ {\} \; # Eso hará que grep piense que hay más de un archivo e imprima el nombre del archivo. –

6

cómo zgrep no son compatibles con -R

creo que el solución de "Nietzche-jou" podría ser una respuesta mejor, pero yo añadiría la opción -H para mostrar el nombre del archivo algo como esto

find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \; 
+0

Gracias por el comando para mostrar el nombre del archivo :) –

6

Viniendo en un poco tarde en esto, tuvo un problema similar y era capaz de r uso de esolve;

zcat -r /some/dir/here | grep "blah" 

Como se detalla aquí;

http://manpages.ubuntu.com/manpages/quantal/man1/gzip.1.html

Sin embargo, esto no muestra el archivo original que el resultado corresponde a, en lugar de mostrar "(entrada estándar)", como se regresa después de un tubo. zcat no parece ser compatible con la salida de un nombre tampoco.

En términos de rendimiento, esto es lo que obtuvimos;

$ alias dropcache="sync && echo 3 > /proc/sys/vm/drop_caches" 

$ find 09/01 | wc -l 
4208 

$ du -chs 09/01 
24M 

$ dropcache; time zcat -r 09/01 > /dev/null 
real 0m3.561s 

$ dropcache; time find 09/01 -iname '*.txt.gz' -exec zcat '{}' \; > /dev/null 
0m38.041s 

Como se puede ver, utilizando el método find|zcat es significativamente más lento que usar zcat -r incluso cuando se trata de un pequeño volumen de archivos. Tampoco fui capaz de hacer que la salida de zcat sea el nombre del archivo (usando -v aparecerá aparentemente el nombre del archivo, pero no en cada línea). Parece que actualmente no hay una herramienta que proporcione tanto la velocidad como la coherencia del nombre con grep (es decir, la opción -H).

Si necesita identificar el nombre del archivo al que pertenece el resultado, entonces deberá escribir su propia herramienta (podría hacerse en 50 líneas de código Python) o usar el método más lento. Si no necesita identificar el nombre, utilice zcat -r.

Esperanza esto ayuda

2

find . -name "*.gz"|xargs zcat | grep "pattern" debe hacer.

Cuestiones relacionadas