【问题标题】:grep show all lines, not just matches, set exit statusgrep 显示所有行,而不仅仅是匹配项,设置退出状态
【发布时间】:2011-09-02 23:30:13
【问题描述】:

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

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

command | egrep -i -v "badpattern"

这可以为我提供我想要的退出代码(如果 badpattern 出现在输出中,则为 1,否则为 0),但是,它只会输出与模式不匹配的行(因为 -v 开关是设计做)。根据我的需要,这些行是最有趣的行。

有没有办法让 grep 盲目地通过它作为输入获得的 all 行,并在适当的时候给我退出代码?

如果没有,我想我可以使用 perl -ne "print; exit 1 if /badpattern/"。我使用 -n 而不是 -p 因为 -p 不会打印有问题的行(因为它在运行单行之后打印 )。所以,我使用 -n 并自己调用 print,这至少给了我第一个违规行,但随后输出(和执行)停在那里,所以我必须做类似的事情

perl -e '$code = 0; while (<>) { print; $code = 1 if /badpattern/; } exit $code'

它完成了整个交易,但有点多,是否有一个简单的 grep 命令行开关可以满足我的需求?

【问题讨论】:

    标签: grep


    【解决方案1】:

    其实你的 perl 想法还不错。试试:

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

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

    【讨论】:

    • 酷,至少也比我的 perl 更短。
    【解决方案2】:
    $ tee /dev/tty < ~/.bashrc | grep -q spam && echo spam || echo no spam
    

    【讨论】:

    • 所以,最后一部分是不必要的,但第一部分工作......有时。我不明白这一点,但如果我做一个 echo badpattern |三通 /dev/tty | grep -q -v badpattern,它有效。但是,如果我将“badpattern”和其他一些东西放在一个文件中并执行 cat bpfile |三通 /dev/tty | grep -q -v badpattern,它停止工作,退出状态总是返回 0。所以,我很难知道它是否适用于我从 curl(我正在使用的第一个命令)返回的内容。
    【解决方案3】:

    如何重定向到 /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.)
    

    【讨论】:

    • 但我确实想查看所有行。我不想过滤这些行,我只想扫描它们,如果有匹配项,请将退出代码设置为非零。但是无论如何都应该输出所有行。
    • 完全误解了你的 Q,如果你知道输出的长度,你可以做这样的事情grep alias -A1000 -B1000,即在匹配的上下显示 1k 行,即所有输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多