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