2011-05-26 111 views
6

我一个管道命令egrep的,我使用,以确保特定的故障字符串没有出现在其中的一些输出。grep的显示所有行,而不仅仅是匹配,设置退出状态

的不幸的是,命令本身在失败时不会返回适当的非零退出状态,这就是我这样做的原因。

command | egrep -i -v "badpattern" 

以此为据可以作为给我的退出代码我要(1如果badpattern在输出中出现,否则为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,只会做我在找什么?

回答

4

其实,你的Perl的想法是不坏。尝试:

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

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

+0

很酷,至少比我的perl one liner还短。 – hsiu 2011-05-27 13:25:15

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.) 
+0

但我_do_想看到所有行。我不想过滤行,我只是想扫描它们,如果有匹配,请将退出代码设置为非零。但是不管怎样,所有行都应该输出。 – hsiu 2011-05-26 21:58:37

+0

Missunderstood您的Q完全,如果你知道输出的长度,你可以做这样的'grep别名-A1000 -B1000'即显示1k行高于和低于匹配即所有输出 – 2011-05-26 22:06:54

2
$ tee /dev/tty < ~/.bashrc | grep -q spam && echo spam || echo no spam 
+0

因此,最后一部分是不必要的,但是第一部分作品......有时。我不明白这一点,但如果我做一个echo badpattern | tee/dev/tty | grep -q -v badpattern,它的工作原理。但是,如果我将“badpattern”放在一个带有其他东西的文件中,并执行cat bpfile | tee/dev/tty | grep -q -v badpattern,它停止工作,退出状态总是返回0.所以,我很难知道它是否适用于我从curl返回的内容(我使用的第一个命令)或不是。 – hsiu 2011-05-26 22:18:56

相关问题