我有一个程序(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
来做到这一点?
任何涉及awk或sed的解决方案也可以。
更新
我所希望的是一个单行——我的头脑看不到——来做到这一点,让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
注意:awk
将0
视为假,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"