递归地在gzip文件列表中搜索匹配的模式

6
我在命令行上使用以下命令来获取匹配模式的行。
find . -name "*.gz"|xargs gzcat|grep -e "pattern1" -e "pattern2"

我现在需要找到只包含该模式的文件名。 我该如何在命令行上实现呢?
由于我在使用xargs gzcat之前使用了grep,所以grel -l没有用处。
6个回答

5

检查您是否有可用的 zgrep。如果是:

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

如果您没有它 - 那么就从已经拥有它的机器上复制它(我使用的所有Linux都默认拥有它)- 这是一个简单的bash脚本。


2

ripgrep

例如,使用ripgrep非常高效,尤其是对于大文件:

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

或者:

rg -z "pattern1|pattern2" .

或者:

rg -zf pattern.file .

其中pattern.file是一个包含所有模式的文件,每个模式用换行符分隔。

-z/--search-zip在压缩文件(如gzbz2xzlzma)中进行搜索。


1

未经测试;将所有操作均在find命令内完成,因此如果您有大量的gz文件,将不会出现性能问题,因为它会在找到文件后立即运行每个gzcat / grep 命令,而不会将任何内容输出:

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

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

刚好错过了这个想法。如果我得到它,我会写一个类似的命令。 - Vijay
在没有zgrep和root权限的系统上很好用。谢谢。在某些系统上,您可能需要使用gcat而不是gzcat。 - Marc Johnen

0

grep/zgrep/zegrep

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

在Unix上,您还可以使用grep(它是BSD版本),带有-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选项时,**会递归检查文件,否则请使用-r

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

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

-ZBSD),-z/--decompressBSD/macOS)强制grep像zgrep一样运行。


0
在Bash中,我会像这样做(未经测试):
find . -name '*.gz' | while read f ; do gzcat $f | grep -q -e "pattern1" -e "pattern2" && echo $f ; done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接