Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 递归地grep zip文件列表中的模式_Bash_Unix_Command Line_Grep - Fatal编程技术网

Bash 递归地grep zip文件列表中的模式

Bash 递归地grep zip文件列表中的模式,bash,unix,command-line,grep,Bash,Unix,Command Line,Grep,我在命令行中使用以下命令来获得模式匹配的行 find . -name "*.gz"|xargs gzcat|grep -e "pattern1" -e "pattern2" 我现在只需要找到模式存在的文件名。 如何在命令行上执行此操作 grel-l没有用,因为我在bash中使用xargs gzcat之前,我会这样做(未经测试): 未经测试;内部的所有内容都找到了吗?因此,如果您有大量的gz文件,那么您就不会有性能问题,因为每次gzcat/grep找到文件后,都会立即运行,但没有输出任何文件:

我在命令行中使用以下命令来获得模式匹配的行

find . -name "*.gz"|xargs gzcat|grep -e "pattern1" -e "pattern2"
我现在只需要找到模式存在的文件名。 如何在命令行上执行此操作


grel-l
没有用,因为我在bash中使用
xargs gzcat
之前,我会这样做(未经测试):


未经测试;内部的所有内容都找到了吗?因此,如果您有大量的gz文件,那么您就不会有性能问题,因为每次gzcat/grep找到文件后,都会立即运行,但没有输出任何文件:

find . -iname '*.gz' -exec bash -c 'gzcat $1 | grep -q -e "pattern1" -e "pattern2" && echo $1' {} {} \;

检查是否有zgrep可用。然后,如果是:

find . -name '*.gz' -exec zgrep -l -e ".." -e ".." {} +
如果您没有它——好吧,只需从拥有它的机器上复制它(我使用的所有linuxes默认都有)——这是一个简单的bash脚本

使用
ripgrep
,例如,它非常有效,特别是对于大型文件:

rg -z -e "pattern1" -e "pattern2" *.gz
或:

或:

其中,
pattern.file
是一个包含所有模式的文件,模式之间用新行字符分隔

-z
/
-搜索压缩文件中的zip
搜索(例如
gz
bz2
xz
lzma

grep
/
zgrep
/
zegrep
使用
zgrep
zegrep
在压缩文件中使用其未压缩内容(GNU/Linux和BSD/Unix)查找模式

在Unix上,还可以将
grep
(即)与
-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
/
--扩展regexp
将模式解释为扩展正则表达式(如
egrep

-Z
(),
-Z
/
--decompress
()强制grep充当
zgrep


只是没有想到。如果我得到它,我会编写一个类似的命令。在没有zgrep的系统上工作得很好,我没有root权限。非常感谢。在某些系统上,您可能必须使用gcat而不是gzcat。
rg -z -e "pattern1" -e "pattern2" *.gz
rg -z "pattern1|pattern2" .
rg -zf pattern.file .
zgrep -E -r "pattern1|pattern2|pattern3" .
zegrep "pattern1|pattern2|pattern3" **/*.gz
grep -z -e "pattern1" -e "pattern2" *.gz # BSD/Unix only.