рекурсивно вводит шаблон в список zip-файлов

#bash #unix #command-line #grep

#bash #unix #командная строка #grep

Вопрос:

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

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

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

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

Ответ №1:

Проверьте, доступен ли у вас zgrep. И затем, если да:

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

Если у вас его нет — что ж, просто скопируйте его с какой-нибудь машины, на которой он есть (все linuxes, которые я использую, имеют его по умолчанию) — это простой скрипт bash.

Ответ №2:

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 ).

Ответ №3:

 for i in $(find . -name "*.gz"); do gzcat $i|grep -qe "n1" -e "n2" amp;amp; echo $i; done
  

Комментарии:

1. просто пропустил мысль. если бы он у меня был, я бы написал аналогичную команду.

2. Прекрасно работает в системе без zgrep, где у меня нет прав root. Спасибо. В некоторых системах вам, возможно, придется использовать gcat вместо gzcat.

Ответ №4:

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

 find . -iname '*.gz' -exec bash -c 'gzcat $1 | grep -q -e "pattern1" -e "pattern2" amp;amp; echo $1' {} {} ;
  

Ответ №5:

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

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

Ответ №6:

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 .