检查文件是否包含字符串 1 而不是字符串 2



我有一个程序(prog)需要花费大量时间来产生输出。

我需要检查输出是否包含字符串 1而不是字符串 2

现在我做以下事情。 它调用prog 2 次。

if   prog | grep -q 'some string' &&
   ! prog | grep -q 'another string'; then
    echo 'OK'
else
    echo 'Not OK'
fi

有没有办法只调用 1 次prog来做到这一点?

任何涉及awksed的解决方案也可以。

更新

我所希望的是一个单行——我的头脑看不到——来做到这一点,让GNU coreutils可供我使用。

我认为如果不

执行两次或更好的prog将其输出保存到临时文件中,grep是不可能的。

我建议使用awk

awk '/string1/{a=1}/string2/{b=1}END{exit !a && b}'

您可以在 shell 脚本中使用它,如下所示:

if prog | awk '/string1/{a=1}/string2/{b=1}END{exit !a && b}' ; then
    echo "ok"
else
    echo "not ok"
fi

注意:awk0视为假,1视为真。外壳将0视为真,1视为假。为了反映我们返回!a && b而不是a && !b,这首先可能看起来更合理。

使用 sed,输出满足要求的行:

prog | sed -n ':a;$!N;s/n//;ta;/string1/{/string2/!p}'

更新:

要测试 sed 命令 (GNU sed):

prog | sed -n ':a;$!N;s/n//;ta;/string1/{/string2/!{q};/string2/{q 1}}' && echo "ok" || echo "nok"

对于使用 grep 命令的问题:

prog | grep -E 'string1|string2' | tr -d "n" | grep  -v string2 | grep string1 && echo "OK" || echo "NOT OK" 

相关内容

  • 没有找到相关文章

最新更新