2013-08-02 2 views
8

Ich habe ein Problem, das ich jemand bin der Hoffnung, in der Lage, mit ...grep -f auf Dateien in einem Zip-Ordner

ich zu helfen, eine rekursive fgrep/grep -f Suche bin Ausführen auf einem gezippt Ordner mit Sie den folgenden Befehl in einem meiner Programme:

der Befehl I

grep -r -i -z -I -f /path/to/pattern/file /home/folder/TestZipFolder.zip 

Innerhalb der pattern-Datei verwende ist die Zeichenfolge „Dog“, die ich für die Suche versuche.

Im gezippten Ordner befinden sich eine Reihe von Textdateien mit der Zeichenfolge "Dog".

Der Befehl grep -f findet erfolgreich die Textdateien mit der Zeichenkette "Hund" in 3 Dateien innerhalb des gezippten Ordners, aber die Ausgabe wird in einer Zeile ausgegeben und einige seltsame Zeichen erscheinen am Ende dh PK (als unten gezeigt). Und wenn ich die Ausgabe in eine Datei in meinem Programm andere Zeichen versuchen und drucken erscheinen am Ende wie ^B^T^@

Ausgabe vom grep -f Befehl:

TestZipFolder/test.txtThis is a file containing the string DogPKtest1.txtDog, is found again in this file.PKTestZipFolder/another.txtDog is written in this file.PK 

Wie würde ich erhalten jeweils von die Dateien, bei denen die Zeichenkette "Hund" gefunden wurde, um in einer neuen Zeile zu drucken, so dass sie nicht alle in einer Zeile gruppiert sind, so wie sie jetzt sind? Woher kommen auch die "PK" und andere seltsame Zeichen in der Ausgabe und wie verhindere ich, dass sie erscheinen?

Wunsch Ausgang

TestZipFolder/test.txt:This is a file containing the string Dog 
TestZipFolder/test1.txt:Dog, is found again in this file 
TestZipFolder/another.txt:Dog is written in this file 

Etwas in diese Richtung, wobei der Benutzer in der Lage ist zu sehen, wo der String in der Datei (Sie tatsächlich die Ausgabe erhalten in diesem Format zu finden, wenn Sie den grep laufen Befehl für eine Datei, die keine Zip-Datei ist).

Ihre Hilfe bei dieser sehr geschätzt wird, dank

Antwort

10

Wenn Sie einen mehrzeiliges Ausgang benötigen, besser nutzen zipgrep:

zipgrep -s "pattern" TestZipFolder.zip 

die es sind Fehlermeldungen (optional) zu unterdrücken . Dieser Befehl druckt alle übereinstimmenden Zeilen zusammen mit dem Dateinamen. Wenn Sie die doppelten Namen entfernen möchten, wenn mehr als eine Übereinstimmung in einer Datei vorhanden ist, müssen einige andere Verarbeitungen mit loops/grep oder awk oder sed durchgeführt werden.

Eigentlich zipgrep ist eine Kombination egrep und dekomprimieren. Und seine Verwendung ist wie folgt:

zipgrep [egrep_options] pattern file[.zip] [file(s) ...] [-x xfile(s) ...] 

so können Sie alle egrep Optionen daran übergeben.

+0

kann ich auch zeigen, wo die Übereinstimmung in der Datei ist, wie im Befehl grep in meiner Frage ?, anstatt nur die Datei aufzulisten, in der sie gefunden wurde? - vielen Dank –

+0

können Sie die gewünschte Ausgabe bereitstellen? Wenn Sie das tun, kann ich es versuchen. – blackSmith

+0

Meine Frage aktualisiert, um die gewünschte Ausgabe anzuzeigen. Es ist das gleiche Format, in dem die Ausgabe ist, wenn Sie den Befehl grep für einen Ordner ausführen, der keine Zip-Datei ist (dh es gibt den Namen der Datei an, in der eine Übereinstimmung gefunden wurde, nachdem der Doppelpunkt anzeigt, wo er ist) viel –