【问题标题】:How to judge pipeline output?如何判断管道输出?
【发布时间】:2019-04-28 17:19:21
【问题描述】:

我有以下命令,比如:

command1 | grep "xxxx" 

command1 将输出一些行文本。

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

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

我应该如何编写shell? 谢谢!

【问题讨论】:

    标签: shell grep


    【解决方案1】:

    由于您要测试grep 的退出状态,并且您想查看不包含xxxx 的行,您可以修改以下代码以满足我们的要求(我使用的是@987654324 @ 作为您的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 的输出,但不希望看到它,所以grep-v 选项会反转逻辑,只打印与xxxx 不匹配的行。 grep -v 'xxxx' 的状态是 0 当它只找到不匹配 xxxx 的行时,1 如果它找到匹配的行。 !操作符反转这个状态,if测试反转状态是否为0,如果反转状态为0则执行then代码。

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

    【讨论】:

      猜你喜欢
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      • 2012-10-10
      • 2021-08-23
      • 1970-01-01
      相关资源
      最近更新 更多