以递归方式在zip文件列表中grep一个模式

时间:2011-05-03 10:57:06

标签: bash unix command-line grep

我在命令行上使用以下命令来获取模式匹配的行。

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

我现在需要只找到模式所在的文件名。 我怎么能在命令行上做到这一点?

grel -l没有用,因为我在xargs gzcat之前使用grep

6 个答案:

答案 0 :(得分:4)

检查您是否有zgrep可用。然后,如果是的话:

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

如果你没有它 - 好吧,只需从有它的机器上复制它(我默认使用的所有linux都有它) - 这是一个简单的bash脚本。

答案 1 :(得分:1)

未测试;内部的一切都找到了所以如果你有大量的gz文件,你就不会遇到性能问题,因为一旦找到文件就运行每个gzcat / grep没有任何东西被输出:

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

在bash中,我会做这样的事情(未经测试):

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

答案 4 :(得分:0)

ripgrep

使用ripgrep,例如,它非常有效,特别是对于大文件:

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

或:

rg -z "pattern1|pattern2" .

或:

rg -zf pattern.file .

其中pattern.file是一个包含由新行字符分隔的所有模式的文件。

  

-z / --search-zip搜索压缩文件(例如gzbz2xzlzma)。

答案 5 :(得分:0)

grep / zgrep / zegrep

使用zgrepzegrep使用未压缩的内容(GNU / Linux和BSD / Unix)查找压缩文件中的模式。

在Unix上,您还可以将grepBSD version)与-Z一起使用,包括macOS上的-z

几个例子:

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

注意:当您globbing option enabled时,**会递归检查文件,否则请使用-r

  

-R / -r / --recursive递归搜索列出的子目录。

     

-E / --extended-regexp将模式解释为扩展正则表达式(如egrep)。

     

-ZBSD),-z / --decompressBSD/macOS)强制grep表现为zgrep