检查文件是否包含 string1 而不是 string2

Check if file contains string1 AND NOT string2

我有一个程序 (prog) 需要很长时间才能生成其输出。

我需要检查输出是否包含 string1 而不是 string2.

现在我执行以下操作。它调用 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。

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

我建议使用 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 视为真。 shell 将 0 视为真,将 1 视为假。为了反映我们 return !a && b 而不是 a && !b,这可能首先看起来更合理。

使用grep命令解决问题:

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

用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"