检查文件是否包含string1 AND NOT string2

时间:2016-05-29 11:30:07

标签: bash grep gnu-coreutils

我有一个程序(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吗?

是否有办法做到这一点

任何涉及 awk sed 的解决方案都可以。

更新

我所希望的是一个单线 - 我的头脑无法看到 - 做到这一点,我可以使用GNU coreutils。

3 个答案:

答案 0 :(得分:3)

我认为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视为false,将1视为true。 shell将0视为true,将1视为false。为了反映我们返回!a && b而不是a && !b,这可能看起来更合理。

答案 1 :(得分:2)

使用sed,输出符合要求的行:

strtok

更新:

测试sed命令(GNU sed):

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

答案 2 :(得分:1)

使用grep命令解决问题:

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