如何判断管道输出?

时间:2018-11-27 01:56:41

标签: shell grep

我有以下命令,例如:

command1 | grep "xxxx" 

command1将输出一些行文本。

我希望当行包含exit 1时执行xxxx,或将行输出到控制台,例如:

command1 | if [ grep "xxxx" ] then; exit 1; else echo;

我应该如何编写外壳? 谢谢!

1 个答案:

答案 0 :(得分:0)

由于您要测试grep的退出状态,并且要查看该行是否不包含xxxx,因此可以修改以下代码以适应我们的要求( m使用echo "$line"作为command1的替代品,我回显exit 1而不是在您的代码执行exit 1时实际退出:

for line in 'hello xxxx here' 'hello yyyy here'
do
    if ! echo "$line" | grep -v 'xxxx'
    then echo "exit 1"
    fi
done

输出为:

exit 1
hello yyyy here

请参阅How can I negate the return value of a process?,以了解POSIX Shell(例如Bash)中的!运算符。

由于您不想在包含xxxx的情况下看到输出,而是这样做,因此-v的{​​{1}}选项会反转逻辑,只打印与{ {1}}。当grep的状态仅是找到与xxxx不匹配的行时,其状态为0;而如果grep -v 'xxxx'所找到的行与之匹配,则状态为0。 xxxx运算符反转此状态,1测试反转状态是否为0,如果反转状态为0,则执行!代码。

请注意,if只是返回then测试的合适退出状态的命令。在许多系统上,您可以找到[作为可执行文件,也许是指向if的(符号?)链接-但是现代的shell总是将/bin/[/bin/test视为内置文件,在命令中。请注意,[检查其最后一个参数是否为test,如果不是,则检查对象。 [不会。