为什么“grep -q -v”仅适用于单行输入?

为什么“grep -q -v”仅适用于单行输入?

如果我grep -q结合使用-v,如果没有匹配则返回 0,如果有匹配则返回 1,只要输入是单行,它就可以工作:

$ echo 'abc' | grep -q -v a; echo $?
1
$ echo 'abc' | grep -q -v x; echo $?
0

但如果输入是多行,grep 将始终返回 0:

$ echo -e 'a\nb\nc' | grep -q -v a; echo $?
0
$ echo -e 'a\nb\nc' | grep -q -v x; echo $?
0

这种行为的原因是什么?

我知道在这种情况下正确的方法是使用! grep -q而不是grep -q -v,但我仍然想知道答案。

答案1

根据 grep 手册:

-v, --invert-match
         Selected lines are those not matching any of the specified patterns.

如果您只提供一行abc并告诉grep仅选择不匹配的行,a您将得到一个空输出并返回等于 1 的代码。

如果您提供三行ab和 ,c并告诉grep您仅选择那些与a您在输出中得到的b和不匹配的行,c并且 0 作为返回代码。

$ echo -e 'a\nb\nc' | grep -v a; echo $?
b
c
0

相关内容