Linux Grep(或可选)对于2个字符串,匹配一个、另一个或两者都是成功的,包含任何其他内容都是失败的

Linux Grep(或可选)对于2个字符串,匹配一个、另一个或两者都是成功的,包含任何其他内容都是失败的,linux,bash,ksh,Linux,Bash,Ksh,我想分析命令的输出。 我有两个可能的字符串匹配。 如果我匹配其中一个、另一个或两者,我将其归类为及格。 如果输出包含任何其他内容,我希望将其标记为失败 这是我的原始代码,大部分时间都有效。 但是当输出(在罕见的情况下)同时包含我的两个字符串时,这是允许的。它标记为失败: if [ "$STATUS" != "Ok" ] && [ "$STATUS" != "Non-Critical" ] then echo "FAILED: STATU

我想分析命令的输出。 我有两个可能的字符串匹配。 如果我匹配其中一个、另一个或两者,我将其归类为及格。 如果输出包含任何其他内容,我希望将其标记为失败

这是我的原始代码,大部分时间都有效。 但是当输出(在罕见的情况下)同时包含我的两个字符串时,这是允许的。它标记为失败:

 if [ "$STATUS" != "Ok" ] && [ "$STATUS" != "Non-Critical" ]             
   then  
   echo "FAILED: STATUS NOT 'Ok' OR NOT 'Non-Critical'"
   else
   echo " Status check good."
 fi
当我的输出包含两个字符串时,上述操作将失败,这不是我想要的

因此,需要明确的是: 好的,这本身就是一个通行证

非批判性-就其本身而言是一种通行证

嗯 非关键-是一个通行证

非关键 好的,这是通行证

其他任何东西都是失败的


希望比我聪明的人能帮上忙:-)

你可以用sed来做这件事

echo -e "Critical\nNon-Critical\nNon-Critical Ok" | 
  sed 's/.*\(Non-Critical\|Ok\).*/PASS/;t;s/.*/FAIL/'
说明:首先,我们将“非关键”或“确定”以及该行中的所有其他内容替换为PASS;然后,成功匹配后,命令
t
跳到脚本末尾。然而,如果比赛不成功,一切都会被失败所取代。上述命令的输出:

FAIL
PASS
PASS
一个案子怎么样

case "$STATUS" in
*Non-Critical*) echo PASS;;
          *Ok*) echo PASS;;
             *) echo FAIL;;
esac
我错过了什么吗?

这是一个perl版本

echo -e "Critical\nNon-Critical\nNon-Critical Ok" | perl -ne 'print((/Non-Critical|Ok/?PASS:FAIL)."\n")'
FAIL
PASS
PASS
对于三值运算符
a?b:c
look

(仅适用于ksh)

或者,如果您不希望它与大小写无关(在bash和ksh中都适用)


您是否在
“状态”中忘记了
$
“非关键”
如果我匹配一个
这是一个精确匹配,还是要搜索任何子字符串是否匹配?如果在
的“状态”中放入
$
,我想代码应该可以正常工作“非关键”
正如@JanuarySorry所指出的,这是一个输入错误,我确实有美元。如果它允许,我会更正它。@Mihir:不是真的,因为状态可能是“非关键Ok”,然后条件失败。
#!/bin/ksh

if [[ $STATUS = @(~(+i:*OK*)) || $STATUS = @(~(+i:*Non-Critical*)) ]]; then
        echo "good"
else
        echo "bad"
fi
if [[ $STATUS = @(*OK*) || $STATUS = @(*Non-Critical*) ]]; then ............