递归 zgrep 不起作用

Nos*_*tap 12 linux bash grep command-line

我有一个包含大量.gz文件的目录层次结构。我希望能够为字符串“foo”递归地grep它们。根据我在网上阅读的内容,以下内容应该有效:

zgrep -R -H "foo" .
Run Code Online (Sandbox Code Playgroud)

但是,这永远不会返回任何结果。如果我用文件名替换点,它确实有效。例如,

zgrep -R -H "foo" myFile.gz
Run Code Online (Sandbox Code Playgroud)

然而,显然,这不再是递归的。

我知道“foo”在一些文件中,因为以下命令返回许多结果:

find . -iname "*.gz" | xargs zgrep "output" | less
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么我的递归 zgrep 命令不起作用。我在 RHEL linux 机器上

lep*_*epe 9

我通常的做法是:

zgrep "foo" $(find . -name "*.gz")
Run Code Online (Sandbox Code Playgroud)

或者(但是,文件名将打印在每个结果之前而不是每行之前——而不仅仅是具有匹配项的文件——):

find . -name "*.gz" -print -exec zgrep "foo" {} \;
Run Code Online (Sandbox Code Playgroud)

如果该命令返回“参数列表太长”,请尝试以下方法:

for I in $(find . -name "*.gz"); do zgrep "foo" $I; done
Run Code Online (Sandbox Code Playgroud)


小智 8

您必须安装 zutils。这会将系统上默认且受限的 zgrep 替换为可递归的 zgrep。

在基于 debian 的系统上,您apt-get install zutils可以运行zgrep -rH myword .并使用您熟悉和喜爱的 grep 中的大多数其他参数。


Geo*_*ord 5

你快到了。尝试这个:

zgrep -R -H "foo" *.gz
Run Code Online (Sandbox Code Playgroud)

编辑:嗯……有趣!

根据我的 zgrep,-R(递归)不是一个选项。它根本不支持。我要检查一下 zgrep 的手册页内容。

一种仅依赖于一级子目录的替代方法是执行以下操作:

zcat */*.gz | grep <needle>
Run Code Online (Sandbox Code Playgroud)

但我建议你的 find 命令可能更好!

  • 当我尝试时,我得到:`zsh:找不到匹配项:*.gz` (2认同)