2013-08-02 3 views
8

У меня есть проблема, я надеюсь, кто-то сможет помочь ...Grep -f для файлов в архивированной папке

Я выполняю рекурсивный fgrep/Grep -f поиска на застежку папки с помощью следующая команда в одной из моих программ:

команды Я использую

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

Внутри файл шаблона является строкой «Собака», что я пытаюсь найти.

В папке с застежкой-молнией имеется несколько текстовых файлов, содержащих строку «Собака».

Команда grep -f успешно находит текстовые файлы, содержащие строку «Собака», в 3 файлах внутри зашифрованной папки, но печатает вывод на одной строке, а в конце появляются некоторые странные символы, то есть PK (as показано ниже). И когда я пытаюсь напечатать вывод в файл в моей программе другие символы появляются на конце, такие как ^B^T^@

Выход из 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 

Как я мог бы получить каждый из файлы, где строка «Собака» была найдена для печати на новой строке, чтобы они не были сгруппированы вместе на одной строке, как сейчас? И где находятся «ПК» и другие странные символы, появляющиеся на выходе, и как я могу помешать им появиться?

Желаемая выход

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 

Что-то вдоль этих линий, в результате чего пользователь может увидеть, где строка может быть найдена в файле (вы на самом деле получить выход в этом формате, если вы запустите Grep команда на файл, который не является zip-файлом).

ваша помощь с этим очень ценится, благодаря

ответ

10

Если вам нужен многострочный вывод, лучше использовать zipgrep:

zipgrep -s "pattern" TestZipFolder.zip 

-s является подавление сообщений об ошибках (по желанию) , Эта команда будет печатать все согласованные строки вместе с именем файла. Если вы хотите удалить повторяющиеся имена, если в файле содержится более одного соответствия, некоторая другая обработка должна выполняться с использованием циклов/grep или awk или sed.

На самом деле, zipgrep представляет собой сочетание и задать расширенное распаковать. И его использование выглядит следующим образом:

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

, так что вы можете передать любые варианты egrep.

+0

Есть ли способ показать, где совпадение находится в файле, например, в команде grep в моем вопросе ?, а не просто перечислять файл, в котором он найден? - Большое спасибо –

+0

Можете ли вы предоставить желаемый результат? Если да, я могу попробовать. – blackSmith

+0

Обновлен мой вопрос, чтобы показать желаемый результат. Это тот же формат, что и выход, если вы запустите команду grep в папке, которая не является zip-файлом (то есть она дает имя файла, в котором было найдено совпадение, после того, как двоеточие показывает, где оно). много –

Смежные вопросы