
Wenn ich es grep -q
in 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 -q
anstelle 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 abc
und anweisen grep
, nur nicht übereinstimmende Zeilen auszuwählen, a
erhalten Sie eine leere Ausgabe und einen Rückgabecode gleich 1.
Wenn Sie die drei Zeilen a
, b
, und angeben c
und anweisen grep
, nur die nicht übereinstimmenden auszuwählen, a
erhalten Sie b
und c
in der Ausgabe und 0 als Rückgabecode.
$ echo -e 'a\nb\nc' | grep -v a; echo $?
b
c
0