递归地grep gzip 文件列表中的模式

问题描述 投票:0回答:6

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

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

我现在只需要查找存在该模式的文件名。 我怎样才能在命令行上做到这一点?

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

bash unix command-line grep
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
在压缩文件中搜索(例如
gz
bz2
xz
lzma
)。


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

1
投票

未经测试; find 中的所有内容都会执行,因此如果您有大量 gz 文件,则不会出现性能问题,因为一旦找到文件就运行每个 gzcat/grep ,不会输出任何内容:

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

0
投票

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

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

0
投票

grep
/
zgrep
/
zegrep

使用

zgrep
zegrep
使用未压缩内容(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.

注意:当您启用通配选项时,

**
会递归检查文件,否则使用
-r

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

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

-Z
(BSD)、
-z
/
--decompress
(BSD/macOS) 强制 grep 表现得像
zgrep

© www.soinside.com 2019 - 2024. All rights reserved.