2013-08-02 11 views
8

mam problem mam nadzieję, że ktoś będzie w stanie pomóc ...-f grep na plikach w formacie skompresowanym folderze

ja wykonywania rekurencyjnej fgrep/grep -f wyszukiwania na skompresowanego folderu za pomocą górę następujące polecenie w jednym z moich programów:

polecenie używam

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

Wewnątrz pliku sygnatur jest ciąg „Dog”, który staram się szukać.

W spakowanym folderze znajduje się wiele plików tekstowych zawierających ciąg "Pies".

Polecenie grep -f powodzeniem wyszukuje pliki tekstowe zawierające ciąg „Dog” w 3 plikach wewnątrz skompresowaniu folderu, ale wypisuje wyjście wszystko w jednej linii, a niektóre dziwne znaki pojawiają się na końcu tj PK (jak pokazane poniżej). I gdy próbuję i wydrukować dane wyjściowe do pliku w moim programie inne znaki pojawiają się na końcu, takich jak ^B^T^@

Wyjście z poleceniem grep -f:

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 

Jak dostanę każdego pliki, w których napis "Pies" został wydrukowany w nowej linii, więc nie są one zgrupowane razem w jednym wierszu, tak jak teraz? Również, gdzie są "PK" i inne dziwne znaki pojawiające się na wyjściu i jak mogę im zapobiec?

Pożądany wyjście

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 

Coś wzdłuż tych linii, dzięki czemu użytkownik jest w stanie zobaczyć, gdzie łańcuch można znaleźć w pliku (rzeczywiście dostać wyjście w tym formacie, jeśli uruchomić grep polecenie na pliku, który nie jest plikiem zip).

twoja pomoc z tym jest bardzo doceniana, dzięki

Odpowiedz

10

Jeśli potrzebujesz wyjście multilinii, lepiej użyć zipgrep:

zipgrep -s "pattern" TestZipFolder.zip 

-s jest pomijanie komunikatów o błędach (opcjonalnie) . To polecenie wydrukuje każdą dopasowaną linię wraz z nazwą pliku. Jeśli chcesz usunąć zduplikowane nazwy, gdy w pliku znajduje się więcej niż jedno dopasowanie, inne przetwarzanie musi zostać wykonane za pomocą pętli/grep lub awk lub sed.

Właściwie zipgrep jest kombinacją egrep i rozpakować. Jego użycie jest następujące:

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

dzięki czemu można przekazać do niego dowolne opcje egrep.

+0

czy jest jakikolwiek sposób, abym mógł pokazać, gdzie jest mecz w pliku, jak w poleceniu grep w moim pytaniu ?, a nie tylko wyświetlać plik, w którym się znajduje? - dziękuję bardzo –

+0

czy możesz podać żądane wyjście? Jeśli tak, mogę spróbować. – blackSmith

+0

Zaktualizowałem moje pytanie, aby wyświetlić pożądany wynik. Jest to ten sam format danych wyjściowych, jeśli uruchomisz polecenie grep w folderze, który nie jest plikiem zip (tzn. Podaje nazwę pliku, w którym znaleziono dopasowanie, a następnie dwukropek pokazuje, gdzie jest) dzięki dużo –