用于gz文件的递归grep从输出字符串中搜索字符串

时间:2019-01-15 12:45:59

标签: linux bash grep cat

我正在尝试通过gz文件文件夹的递归搜索从字符串输出中搜索字符串。

我使用的命令仅适用于

find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;

来自find string inside a gzipped file in a folder

我怎样才能做到这一点,就像在管道上正常使用grep一样?

cat <folder> | grep 'pattern1' | grep 'pattern2'

3 个答案:

答案 0 :(得分:0)

关于您的具体问题

How can I make this happen just like using normal grep with pipe: cat | grep 'pattern1' | grep 'pattern2'

您可以使用find先将cat的所有文件,然后再grep,但这不是很好,因为您只会得到没有文件名的结果行。

最好只使用两个grep命令:

zgrep 'pattern1' *.gz | grep 'pattern2'

如果要包括子目录,可以使用globstar(假设您正在运行bash):

shopt -s globstar
zgrep 'pattern1' **.gz | grep 'pattern2'

答案 1 :(得分:0)

您可以通过第二个grep传递查找结果:

find . -name "*.gz" -exec zgrep -H "PATTERN1" {} \; | grep "PATTERN2"

答案 2 :(得分:0)

您的“伪代码”(猫| grep'pattern2'| grep'pattern3')是什么意思?

如果我们的文件file.txt包含:

pattern this text on the line <br>
pattern2 this text on the line <br>
this pattern3 <br>
pattern2pattern3 this line

然后输入您的“伪代码”

cat file.txt | grep 'pattern2' | grep 'pattern3'

将导致:pattern2pattern3 this line。如果这是您想要的,我们可以使用

zcat file.gz | grep 'pattern1' | grep 'pattern2'

但是但是,如果我们看一下find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;,它甚至还不很接近,这更像是:

   cat /**.*txt | grep 'pattern'

它本身有点特殊,它的结果将由

给出
grep -R 'pattern'

然后在.gz情况下我会这样说(不确定/**/*.gz是否可与zcat一起使用)

zcat /**/*.gz | grep 'pattern'