我有一个程序(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。
答案 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
注意:awk
将0
视为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"