检查greps返回是否包含某个单词

时间:2017-11-05 16:26:08

标签: bash

当我执行这样的命令时:

~/foo/bar | grep <someID>

输出采用以下格式:

"<someID>": "ENABLED",

状态&#34; ENABLED&#34;也可以是不同的东西,但我想检查我的ID是否已启用

我试过这个:

output= ~/foo/bar | grep <someID>
echo $output

if [[ $output =~ .*ENABLED.* ]]; then  // Method 1
echo "is enabled"
else
echo "not enabled"
fi

case "$output" in                      // Method 2
*ENABLED*)
echo "is enabled"
;;
esac

但我总是觉得它没有启用。

基本上我想做的是检查grep的返回是否包含单词&#34; ENABLED&#34;。

有什么想法吗?

4 个答案:

答案 0 :(得分:0)

直截了当地说:

some_id=2    # for example
if ~/foo/bar | grep -q "$some_id"'": *"ENABLED"' ; then 
    echo "is enabled"
else 
    echo "not enabled"
fi

答案 1 :(得分:0)

你需要在第一行代码中添加反引号。如果你不这样做,那么这可能是你的错误,因为$output未定义,因此是空字符串。

output=`~/foo/bar | grep <someID>`

答案 2 :(得分:0)

如果您只是将适当的数据输入变量,那么检查$output内容的策略都会有效。有多种方法可以将命令输出到变量中。以下都是功能相同的。

output=`~/bin/foo | grep "\"<someID>\""`       # deprecated -- use $(...) instead

output="$(~/bin/foo | grep "\"<someID>\"")"    # may result in multiple lines of output

read -r output < <(~/bin/foo | grep "\"<someID>\"")  # uses "Process Substitution"

其中前两个适用于任何旧的POSIX shell。第一个甚至可以在csh / tcsh中使用。使用Process Substitution的最后一个是bash-only(或者至少不是POSIX)。

但正如你在其他答案中看到的那样,你可能不需要变量。您可以使用正则表达式来匹配您感兴趣的整行

if ~/foo/bar | grep -q "\"$someID\""'": *"ENABLED"'; then 
  echo "enabled"
else 
  echo "disabled"
fi

如果$someID可能会在您的输出中出现多次,并且值不同,则此构造会更安全。

如果您使用案例陈述,那么您希望确保在$someID多次出现时知道该怎么做。

while read -r output; do
  case "$output" in
    *ENABLED*) echo "enabled" ;;
    *DISABLED) echo "disabled" ;;
    *) echo "ERROR: Unknown state." >&2 ;;
  esac
done < <(~/foo/bar | grep "\"$someID\"")

答案 3 :(得分:0)

尝试这样的事情:

some_command > /tmp/some_file.tmp
if grep -q "Some_Text" "/tmp/some_file.tmp";
then
echo "These are not the stormtroopers you are looking for."
else
echo "Stay gold, ponyboy."
fi

# Removing the tmp file is optional, but I'm OCD, so...
rm /tmp/some_file.tmp

此命令将在开箱即用的Ubuntu系统或具有BASH终端的任何* nix系统上正常工作。您可以根据自己的使用情况进行调整。

https://stackoverflow.com/a/28360230/4272202启发