没有zgrep的压缩文件上的grep

时间:2018-02-20 15:31:29

标签: bash grep

我需要为一组特定模式的文件(一些是压缩的,一些不是)进行grep。我知道zgrep可以用来压缩压缩文件,但是正在运行的脚本依赖于返回代码0,1,等等的返回代码。

grep说: 如果找到选定的行,则退出状态为0,否则为1。 2如果发生错误。

zgrep声明它的工作方式与grep相同,但可以处理压缩文件。

然而有2个文件:

#test1
hello

#test2
goodbye

都在同一目录中

grep "hello" *按预期返回0,因为在test1中找到了模式

然而,

zgrep "hello" *返回1,即使在test1中找到了模式。它返回1,因为在test2中找不到模式。事实证明,如果任何文件与模式不匹配,则返回1,即使所有其他文件都与模式匹配。

对于我的情况,我只关心至少有1个文件匹配或没有文件匹配。如果有人这样做,有些则不行,那应该算是成功了。

所以有没有办法可以在没有zgrep的情况下对压缩文件和解压缩文件进行grep并获得正确的返回代码,因为zgrep似乎有问题?

grep版本:2.20

zgrep版本:1.5

注意:如果没有经过数月的审批流程,我或系统管理员都无法更改这些版本号,因此请避免使用“更新您的内容”等解决方案

2 个答案:

答案 0 :(得分:2)

这似乎是zgrep中的错误。试试xzgrep

$ xzgrep -q hello *; echo $?
0
$ zgrep -q hello *;echo $?
1
$ grep -q hello *;echo $?
0

如果文件始终为zcat,您也可以同时使用grepgzipped

$ zcat * | grep -q hello; echo $?

答案 1 :(得分:1)

zgrep -m1 -c "a23215" /var/log/syslog.*.gz | egrep -v ":0$" && echo hit || echo miss

显示' miss'对我来说,

zgrep -m1 -c "23215" /var/log/syslog.*.gz | egrep -v ":0$" && echo hit || echo miss

虽然这显示了' hit',因为7个文件中的2个匹配。

更一般:

zgrep -m1 -c "PATTERN" /path/FILEPATTERN* | egrep -q -v ":0$" && echo 1 || echo 0

只返回0或1,没有匹配的文件名。