如何在条件语句中省略grep输出

时间:2014-07-18 04:28:34

标签: macos bash

在Mac上,我想使用pmset确定是否存在任何睡眠断言。如果有,只提取该信息并省略不必要的信息。

如果grep没有返回任何内容我想要打印“Nothing”。

if pmset -g | grep pre ; then pmset -g | grep pre | cut -d'(' -f2 | cut -d')' -f1 ; else printf "Nothing\n" ; fi

问题是打印了第一个grep结果,格式化的结果也是如此。例如,如果正在进行备份,这就是我得到的结果:

  

睡眠15(通过备份阻止睡眠)

     

备份

阻止睡眠

我不想要第一行,并想丢弃它。我只想打印第二行(“备份时阻止睡眠”)。

如果grep结果为空,我想用文本“Nothing”表示。上面的脚本可以正常工作。

可能有更多优雅的解决方案,但我一直在寻找一个。

2 个答案:

答案 0 :(得分:3)

如果我理解你的问题,你只需丢弃第一个grep的输出,而不管它提供的输出。如果是这样,那么您可以使用grep。

提供的-q选项

来自'grep'的手册页:

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

这样的事情:

if ifconfig | grep -q X; then
        ifconfig | grep Mi | cut -d'(' -f2
else
        printf "Nothing\n"
fi


显然在上面的例子中,ifconfig的输出不会每次都改变。仅用作例子。 ;)

答案 1 :(得分:0)

这可能更简洁一些。它grep仅使用grep -o输出与模式匹配的行的部分而不是整行:

#!/bin/bash
SLEEP=$(pmset -g | grep -o "sleep prevented.*[^)]")
if [ -z "$SLEEP" ]; then
   echo Nothing
else
   echo $SLEEP
fi

模式为sleep prevented,遇到任何字符,直到遇到)