我正在将一些命令的输出传递给egrep,我用它来确保没有出现特定的失败字符串。
遗憾的是,命令本身在失败时不会返回正确的非零退出状态,这就是我这样做的原因。
command | egrep -i -v "badpattern"
这可以为我提供我想要的退出代码(如果输出中出现badpattern则为1,否则为0),但是,它只会输出与模式不匹配的行(因为-v开关是旨在做)。根据我的需要,这些线条是最有趣的线条。
有没有办法让grep只是盲目地通过它获取的所有行作为输入,只是给我一个适当的退出代码?
如果没有,我以为我可以使用perl -ne“print;如果/ badpattern /则退出1”。我使用-n而不是-p,因为-p不会打印有问题的行(因为它在运行单行后打印)。所以,我使用-n并自己调用print
,这至少给了我第一个违规行,但是然后输出(和执行)停在那里,所以我必须做类似的事情
perl -e '$code = 0; while (<>) { print; $code = 1 if /badpattern/; } exit $code'
完成了整个交易,但有点多,是否有一个简单的grep命令行开关,它只会做我正在寻找的东西?
答案 0 :(得分:6)
实际上,你的perl想法并不坏。尝试:
perl -pe 'END { exit $status } $status=1 if /badpattern/;'
我敢打赌,这至少与建议的其他选项一样快。
答案 1 :(得分:3)
$ tee /dev/tty < ~/.bashrc | grep -q spam && echo spam || echo no spam
答案 2 :(得分:1)
如何重定向到/ 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.)