Подтвердить что ты не робот

Найти строку внутри файла gzipped в папке

Моя текущая проблема заключается в том, что у меня есть около 10 папок, содержащих gzipped файлы (примерно в среднем по 5 штук). Это позволяет открывать и просматривать 50 файлов.

Есть ли более простой способ выяснить, имеет ли файл gzipped внутри папки определенный шаблон или нет?

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

Вместо записи script, могу ли я сделать то же самое в одной строке, для всех папок и подпапок?

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

Ответ 1

zgrep будет выглядеть в gzip файлах, имеет рекурсивную опцию -R, а -H покажет мне параметр имени файла:

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

Ответ 2

Вам не нужен zcat, потому что есть zgrep и zegrep.

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

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

И также "ls *.gz" бесполезен, и вы должны просто использовать "*.gz" в будущем.

Ответ 3

используйте команду find

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

или попробуйте использовать рекурсивный параметр (-r) zcat

Ответ 4

как zgrep не поддерживает -R

Я думаю, что решение "Nietzche-jou" может быть лучшим ответом, но я бы добавил параметр -H, чтобы показать имя файла примерно так:

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

Ответ 5

Попадая немного позже, возникла аналогичная проблема и он смог разрешить использование;

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

Как подробно описано здесь;

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

Однако это не показывает исходный файл, результат которого соответствует, вместо этого отображается "(стандартный ввод)", когда он поступает из трубы. zcat, похоже, не поддерживает вывод имени.

Что касается производительности, это то, что мы получили,

$ 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

Как вы можете видеть, использование метода find|zcat значительно медленнее, чем использование zcat -r при работе с небольшим объемом файлов. Я также не смог заставить zcat выводить имя файла (используя -v, по-видимому, выводит имя файла, но не на каждую строку). По-видимому, в настоящее время нет инструмента, который обеспечит согласованность скорости и имени с помощью grep (т.е. Параметр -H).

Если вам нужно определить имя файла, к которому принадлежит результат, вам нужно либо написать свой собственный инструмент (может быть выполнен в 50 строк кода Python), либо использовать более медленный метод. Если вам не нужно идентифицировать имя, используйте zcat -r.

Надеюсь, что это поможет

Ответ 6

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