我需要为一组特定模式的文件(一些是压缩的,一些不是)进行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
注意:如果没有经过数月的审批流程,我或系统管理员都无法更改这些版本号,因此请避免使用“更新您的内容”等解决方案
答案 0 :(得分:2)
这似乎是zgrep
中的错误。试试xzgrep
。
$ xzgrep -q hello *; echo $?
0
$ zgrep -q hello *;echo $?
1
$ grep -q hello *;echo $?
0
如果文件始终为zcat
,您也可以同时使用grep
和gzipped
。
$ 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,没有匹配的文件名。