我在命令行上使用以下命令来获取模式匹配的行。
find . -name "*.gz"|xargs gzcat|grep -e "pattern1" -e "pattern2"
我现在需要只找到模式所在的文件名。 我怎么能在命令行上做到这一点?
grel -l
没有用,因为我在xargs gzcat
之前使用grep
答案 0 :(得分:4)
检查您是否有zgrep可用。然后,如果是的话:
find . -name '*.gz' -exec zgrep -l -e ".." -e ".." {} +
如果你没有它 - 好吧,只需从有它的机器上复制它(我默认使用的所有linux都有它) - 这是一个简单的bash脚本。
答案 1 :(得分:1)
未测试;内部的一切都找到了所以如果你有大量的gz文件,你就不会遇到性能问题,因为一旦找到文件就运行每个gzcat / grep没有任何东西被输出:
find . -iname '*.gz' -exec bash -c 'gzcat $1 | grep -q -e "pattern1" -e "pattern2" && echo $1' {} {} \;
答案 2 :(得分:1)
for i in $(find . -name "*.gz"); do gzcat $i|grep -qe "n1" -e "n2" && echo $i; done
答案 3 :(得分:0)
在bash中,我会做这样的事情(未经测试):
find . -name '*.gz' | while read f ; do gzcat $f | grep -q -e "pattern1" -e "pattern2" && echo $f ; done
答案 4 :(得分:0)
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
)。
答案 5 :(得分:0)
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
)。