2009-08-10 4 views
40

Mein aktuelles Problem ist, dass ich ungefähr 10 Ordner habe, die gziped Dateien enthalten (ungefähr durchschnittlich 5). Dies macht es 50 Dateien zu öffnen und zu betrachten.String in einer gezippten Datei in einem Ordner finden

Gibt es eine einfachere Methode, um herauszufinden, ob eine gezippte Datei in einem Ordner ein bestimmtes Muster hat oder nicht?

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

Statt ein Skript zu schreiben, kann ich das gleiche in einer einzigen Zeile, für alle Ordner und Unterordner?

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

Antwort

47

zgrep in gzip-Dateien sucht, hat eine -R rekursive Option, und ein -H zeigen mir die Option filename:

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

FWIW gefunden hat, unterstützt mein zgrep nicht -R – ZombieDev

+0

@Ned Batchelder, Danke für die Angabe einer Richtung. Aber für mich folgende bearbeitet zgrep Optionen "Muster" -Dateien – hiren

+0

'zgrep -R --include = \ *. Gz -H" Muster "auf zsh – blacktooth

7

den Befehl find verwenden

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

oder versuchen, die rekursive Option (-r) von zcat

+0

-bash-3.00 $ finden. -name "* .gz" -exec zcat "{}" + | grep "NICHT OK" find: fehlendes Argument zu '-exec ' etwas scheint nach exec zu fehlen? – gagneet

+0

es funktioniert für mich. – ghostdog74

+0

vielleicht versuchen, ändern zu finden ... +; | grep ... und siehe – ghostdog74

18

Sie brauchen nicht zcat hier, weil es zgrep ist und zegrep.

Wenn Sie einen Befehl über eine Verzeichnishierarchie ausführen möchten, verwenden Sie finden:

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

Und auch „ls *.gz“ in für nutzlos ist, und Sie sollten nur „verwenden * gz " in der Zukunft.

+0

Ich bekomme die Zeilen, die dieses Muster enthalten, aber nicht den Namen der Datei mit dieser Methode. Gibt es einen Weg, das auch aufgelistet zu bekommen? – gagneet

+2

'finden. -name '* .gz' -print0 | xargs -0 zgrep Muster? – Hasturkun

+2

Old Grep Trick: finden. -name "* .gz" -exec zgrep ⟨pattern⟩/dev/null \ {\} \; # Das wird grep denken, dass es mehr als eine Datei gibt und den Dateinamen ausdrucken. –

6

wie zgrep nicht unterstützen -R

ich denke, die Lösung von „Nietzche-jou“ könnte eine bessere Antwort sein, aber ich würde die Option -H zeige die Dateinamen so etwas wie diese

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

Danke für den Befehl, um den Namen der Datei anzuzeigen :) –

6

kommend in einem wenig spät auf diesem, hatte ein ähnliches Problem hinzu und war fähig zu r esolve Verwendung;

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

Wie hier beschrieben;

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

Dies ist jedoch nicht die ursprüngliche Datei nicht zeigen, dass das Ergebnis von angepasst, anstatt „(Standard-Eingabe)“ zeigt, wie sie in aus einem Rohr kommen. zcat scheint auch die Ausgabe eines Namens nicht zu unterstützen.

In Bezug auf die Leistung, das ist, was wir haben;

$ 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 

Wie Sie sehen können, mit der find|zcat Methode ist deutlich langsamer als zcat -r verwenden, wenn auch nur ein kleines Volumen von Dateien handelt. Ich konnte auch nicht zcat Ausgabe der Dateiname machen (mit -v wird offenbar den Dateinamen ausgeben, aber nicht auf jeder einzelnen Zeile). Es scheint, dass es derzeit kein Werkzeug gibt, das sowohl die Geschwindigkeit als auch die Namenskonsistenz mit grep bereitstellt (d. H. Die -H Option).

Wenn Sie den Namen der Datei identifizieren müssen, zu der das Ergebnis gehört, müssen Sie entweder ein eigenes Werkzeug schreiben (in 50 Zeilen Python-Code) oder die langsamere Methode verwenden. Wenn Sie den Namen nicht identifizieren müssen, verwenden Sie zcat -r.

this helps

2

find . -name "*.gz"|xargs zcat | grep "pattern" tun sollten.