我在命令行上使用以下命令来获取模式匹配的行。
find . -name "*.gz"|xargs gzcat|grep -e "pattern1" -e "pattern2"
我现在只需要查找存在该模式的文件名。 我怎样才能在命令行上做到这一点?
grel -l
没有用,因为我在xargs gzcat
之前使用
grep
检查您是否有可用的 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
for i in $(find . -name "*.gz"); do gzcat $i|grep -qe "n1" -e "n2" && echo $i; done
未经测试; find 中的所有内容都会执行,因此如果您有大量 gz 文件,则不会出现性能问题,因为一旦找到文件就运行每个 gzcat/grep ,不会输出任何内容:
find . -iname '*.gz' -exec bash -c 'gzcat $1 | grep -q -e "pattern1" -e "pattern2" && echo $1' {} {} \;
在 bash 中,我会做这样的事情(未经测试):
find . -name '*.gz' | while read f ; do gzcat $f | grep -q -e "pattern1" -e "pattern2" && echo $f ; done
grep
/zgrep
/zegrep
使用
zgrep
或 zegrep
使用未压缩内容(GNU/Linux 和 BSD/Unix)在压缩文件中查找模式。
在 Unix 上,您还可以将
grep
(这是 BSD 版本)与 -Z
一起使用,包括 macOS 上的 -z
。
几个例子:
zgrep -E -r "pattern1|pattern2|pattern3" .
zegrep "pattern1|pattern2|pattern3" **/*.gz
grep -z -e "pattern1" -e "pattern2" *.gz # BSD/Unix only.
注意:当您启用通配选项时,
**
会递归检查文件,否则使用-r
。
/-R
/-r
递归搜索列出的子目录。--recursive
/-E
将模式解释为扩展正则表达式(如--extended-regexp
)。egrep
(BSD)、-Z
/-z
(BSD/macOS) 强制 grep 表现得像--decompress
。zgrep