Warum funktioniert „grep -q -v“ nur mit einzeiliger Eingabe?

Warum funktioniert „grep -q -v“ nur mit einzeiliger Eingabe?

Wenn ich es grep -qin Kombination mit verwende -v, um 0 zurückzugeben, wenn keine Übereinstimmungen vorliegen, oder 1, wenn eine Übereinstimmung vorliegt, funktioniert es, solange die Eingabe aus einer einzelnen Zeile besteht:

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

Wenn die Eingabe jedoch mehrzeilig ist, gibt grep immer 0 zurück:

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

Was ist der Grund für dieses Verhalten?

Ich weiß, dass die richtige Verwendung in diesem Fall ! grep -qanstelle von wäre grep -q -v, aber ich möchte die Antwort trotzdem wissen.

Antwort1

Gemäß Grep-Handbuch:

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

Wenn Sie nur eine Zeile angeben abcund anweisen grep, nur nicht übereinstimmende Zeilen auszuwählen, aerhalten Sie eine leere Ausgabe und einen Rückgabecode gleich 1.

Wenn Sie die drei Zeilen a, b, und angeben cund anweisen grep, nur die nicht übereinstimmenden auszuwählen, aerhalten Sie bund cin der Ausgabe und 0 als Rückgabecode.

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

verwandte Informationen