检查文件是否包含 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
就可以做到这一点?
任何涉及 awk 或 sed 的解决方案都可以。
更新
我所希望的是一个单行程序——我的头脑看不到——来完成这个把戏,让我使用 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
注意:awk
将 0
视为假,将 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"
我有一个程序 (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。
我认为 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
视为假,将 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"