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 机器上
我通常的做法是:
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 中的大多数其他参数。
你快到了。尝试这个:
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 命令可能更好!
| 归档时间: |
|
| 查看次数: |
38010 次 |
| 最近记录: |