grep шаблон в списке zip-файлов рекурсивно - PullRequest
5 голосов
/ 03 мая 2011

Я использую следующую команду в командной строке для получения линий, соответствующих шаблону.

find . -name "*.gz"|xargs gzcat|grep -e "pattern1" -e "pattern2"

Теперь мне нужно найти только имена файлов, в которых присутствует шаблон. как я могу сделать это в командной строке?

grel -l не используется, так как я использую xargs gzcat до grep

Ответы [ 6 ]

4 голосов
/ 03 мая 2011

Проверьте, есть ли у вас zgrep. И тогда, если да:

find . -name '*.gz' -exec zgrep -l -e ".." -e ".." {} +

Если у вас его нет - просто скопируйте его с некоторого компьютера, на котором он установлен (по умолчанию у всех linux он есть) - это простой скрипт bash.

1 голос
/ 03 мая 2011
for i in $(find . -name "*.gz"); do gzcat $i|grep -qe "n1" -e "n2" && echo $i; done
1 голос
/ 03 мая 2011

Непроверено; все внутри находит, поэтому, если у вас есть множество файлов gz, у вас не будет проблем с производительностью, так как каждый gzcat / grep запускает, как только находит файлы, ничего не выводится:

find . -iname '*.gz' -exec bash -c 'gzcat $1 | grep -q -e "pattern1" -e "pattern2" && echo $1' {} {} \;
0 голосов
/ 12 апреля 2018

grep / zgrep / zegrep

Используйте zgrep или zegrep для поиска шаблона в сжатых файлах с использованием их несжатого содержимого (как GNU / Linux, так и BSD / Unix).

В Unix вы также можете использовать grep (то есть BSD версия ) с -Z, включая -z на macOS.

Несколько примеров:

zgrep -E -r "pattern1|pattern2|pattern3" .
zegrep "pattern1|pattern2|pattern3" **/*.gz
grep -z -e "pattern1" -e "pattern2" *.gz # BSD/Unix only.

Примечание. Если включена опция глобализации , ** рекурсивно проверяет файлы, в противном случае используйте -r.

.

-R / -r / --recursive Рекурсивный поиск в подкаталогах.

-E / --extended-regexp Интерпретировать шаблон как расширенное регулярное выражение (например, egrep).

-Z ( BSD ), -z / --decompress ( BSD / macOS ) Заставить grep вести себя как zgrep.

0 голосов
/ 12 апреля 2018

ripgrep

Используйте ripgrep, например, это очень эффективно, особенно для больших файлов:

rg -z -e "pattern1" -e "pattern2" *.gz

или

rg -z "pattern1|pattern2" .

или

rg -zf pattern.file .

Где pattern.file - это файл, содержащий все ваши шаблоны, разделенные символом новой строки.

-z / --search-zip Поиск в сжатых файлах (таких как gz, bz2, xz и lzma).

0 голосов
/ 03 мая 2011

В bash я бы сделал что-то вроде этого (не проверено):

find . -name '*.gz' | while read f ; do gzcat $f | grep -q -e "pattern1" -e "pattern2" && echo $f ; done
...