【发布时间】:2011-08-17 15:01:44
【问题描述】:
我在命令行上使用以下命令来获取模式匹配的行。
find . -name "*.gz"|xargs gzcat|grep -e "pattern1" -e "pattern2"
我现在只需要找到模式所在的文件名。 我如何在命令行上做到这一点?
grel -l没有用,因为我在grep之前使用xargs gzcat
【问题讨论】:
标签: bash unix command-line grep
我在命令行上使用以下命令来获取模式匹配的行。
find . -name "*.gz"|xargs gzcat|grep -e "pattern1" -e "pattern2"
我现在只需要找到模式所在的文件名。 我如何在命令行上做到这一点?
grel -l没有用,因为我在grep之前使用xargs gzcat
【问题讨论】:
标签: bash unix command-line grep
在 bash 中,我会做这样的事情(未经测试):
find . -name '*.gz' | while read f ; do gzcat $f | grep -q -e "pattern1" -e "pattern2" && echo $f ; done
【讨论】:
未经测试;里面的所有东西都找到了,所以如果你有大量的 gz 文件,你就不会遇到性能问题,因为一旦找到文件就运行每个 gzcat/grep,什么都不会输出:
find . -iname '*.gz' -exec bash -c 'gzcat $1 | grep -q -e "pattern1" -e "pattern2" && echo $1' {} {} \;
【讨论】:
for i in $(find . -name "*.gz"); do gzcat $i|grep -qe "n1" -e "n2" && echo $i; done
【讨论】:
检查您是否有可用的 zgrep。然后,如果是的话:
find . -name '*.gz' -exec zgrep -l -e ".." -e ".." {} +
如果你没有 - 好吧,只需从有它的机器上复制它(我使用的所有 linux 默认都有它) - 这是一个简单的 bash 脚本。
【讨论】:
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)。
【讨论】:
grep/zgrep/zegrep
使用zgrep 或zegrep 使用压缩文件的未压缩内容(GNU/Linux 和 BSD/Unix)查找压缩文件中的模式。
在 Unix 上,您还可以将grep(即BSD version)与-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 option enabled,**递归检查文件,否则使用-r。
-R/-r/--recursive递归搜索列出的子目录。
-E/--extended-regexp将模式解释为扩展的正则表达式(如egrep)。
【讨论】: