grep显示所有行,而不仅仅是匹配项,设置退出状态

grep显示所有行,而不仅仅是匹配项,设置退出状态,grep,Grep,我正在将命令的一些输出传送到egrep,我使用它来确保特定的失败字符串不会出现在中 不幸的是,命令本身在失败时不会返回正确的非零退出状态,这就是为什么我要这样做 command | egrep -i -v "badpattern" 这可以为我提供所需的退出代码(如果输出中出现badpattern,则为1,否则为0),但是,它只会输出与模式不匹配的行(正如-v开关设计的那样)。根据我的需要,这些线路是最有趣的线路 有没有办法让grep盲目地通过它作为输入得到的所有行,然后根据需要给我退出代码 如

我正在将命令的一些输出传送到egrep,我使用它来确保特定的失败字符串不会出现在中

不幸的是,命令本身在失败时不会返回正确的非零退出状态,这就是为什么我要这样做

command | egrep -i -v "badpattern"
这可以为我提供所需的退出代码(如果输出中出现badpattern,则为1,否则为0),但是,它只会输出与模式不匹配的行(正如-v开关设计的那样)。根据我的需要,这些线路是最有趣的线路

有没有办法让grep盲目地通过它作为输入得到的所有行,然后根据需要给我退出代码

如果没有,我想我可以使用perl-ne“print;exit 1if/badpattern/”。我使用-n而不是-p,因为-p不会打印有问题的行(因为它是在运行一行之后打印的)。因此,我使用-n并调用
print
我自己,这至少给了我第一行有问题的代码,但随后输出(和执行)停止在那里,所以我必须执行以下操作

perl-e'$code=0;while(){print;$code=1 if/badpattern/;}退出$code'


这就完成了整个任务,但有点多,是否有一个简单的grep命令行开关,可以实现我想要的功能?

如何重定向到/dev/null,从而删除所有行,但仍然可以得到退出代码

$ grep spam .bashrc > /dev/null

$ echo $?
1

$ grep alias .bashrc > /dev/null

$ echo $?
0
或者您可以简单地使用
-q
开关

   -q, --quiet, --silent
          Quiet;   do   not  write  anything  to  standard  output.   Exit
          immediately with zero status if any match is found, even  if  an
          error  was  detected.   Also see the -s or --no-messages option.
          (-q is specified by POSIX.)
$tee/dev/tty<~/.bashrc | grep-q spam和echo spam | | echo no spam

实际上,您的perl想法不错。尝试:

perl -pe 'END { exit $status } $status=1 if /badpattern/;'

我打赌这至少和建议的其他选项一样快。

但我确实希望看到所有行。我不想过滤这些行,我只想扫描它们,如果有匹配项,将退出代码设置为非零。但是不管怎样,所有的行都应该被输出。完全错误地理解了你的Q,如果你知道输出的长度,你可以这样做
grep alias-A1000-B1000
,即在匹配的上面和下面显示1k行,即所有输出。所以,最后一部分是不必要的,但第一部分是有效的。。。有时候。我不明白这一点,但如果我使用echo-badpattern | tee/dev/tty | grep-q-v-badpern,它就会工作。但是,如果我把“badpattern”和其他东西放在一个文件中,然后执行cat bpfile | tee/dev/tty | grep-q-v badpattern,它就会停止工作,退出状态总是返回0。因此,我很难知道它是否适用于我从curl(我正在使用的第一个命令)得到的结果。
perl -pe 'END { exit $status } $status=1 if /badpattern/;'