Ответ 1
zgrep будет выглядеть в gzip файлах, имеет рекурсивную опцию -R, а -H покажет мне параметр имени файла:
zgrep -R --include=*.gz -H "pattern match" .
Моя текущая проблема заключается в том, что у меня есть около 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;
zgrep будет выглядеть в gzip файлах, имеет рекурсивную опцию -R, а -H покажет мне параметр имени файла:
zgrep -R --include=*.gz -H "pattern match" .
Вам не нужен zcat, потому что есть zgrep и zegrep.
Если вы хотите запустить команду над иерархией каталогов, вы можете найти:
find . -name "*.gz" -exec zgrep ⟨pattern⟩ \{\} \;
И также "ls *.gz
" бесполезен, и вы должны просто использовать "*.gz" в будущем.
используйте команду find
find . -name "*.gz" -exec zcat "{}" + |grep "test"
или попробуйте использовать рекурсивный параметр (-r) zcat
как zgrep не поддерживает -R
Я думаю, что решение "Nietzche-jou" может быть лучшим ответом, но я бы добавил параметр -H, чтобы показать имя файла примерно так:
find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;
Попадая немного позже, возникла аналогичная проблема и он смог разрешить использование;
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
.
Надеюсь, что это поможет
find . -name "*.gz"|xargs zcat | grep "pattern"
.