Jak mogę ukryć wyjście z grep, aby zwracało tylko status wyjścia?

57

Mam greprozkaz Szukam słowa kluczowego z pliku, ale nie chcę wyświetlać dopasowania. Chcę tylko poznać status wyjścia grep.

jackass27
źródło

Odpowiedzi:

69

Każda wersja zgodna z POSIXgrep ma przełącznik -qcichy:

-q
     Quiet. Nothing shall be written to the standard output, regardless
     of matching lines. Exit with zero status if an input line is selected.

W GNU grep (i ewentualnie innych) możesz również używać synonimów z długimi opcjami:

-q, --quiet, --silent     suppress all normal output

Przykład

Ciąg istnieje:

$ echo "here" | grep -q "here"
$ echo $?
0

Ciąg nie istnieje:

$ echo "here" | grep -q "not here"
$ echo $?
1
slm
źródło
6

Wystarczy przekierować wyjście grepdo /dev/null:

grep sample test.txt > /dev/null

echo $?
Cuonglm
źródło
1
Nie powiedzie się to, echo $?jeśli grepzwróci niezerowy kod wyjścia.
WinnieNicklaus,
2

Musisz po prostu połączyć się grep -q <pattern>z natychmiastowym sprawdzeniem kodu wyjścia, aby ostatni proces zakończył ( $?).

Możesz użyć tego do zbudowania takiego polecenia, na przykład:

uname -a | grep -qi 'linux' ; case "$?" in "0") echo "match" ;; "1") echo "no match" ;; *) echo "error" ;; esac

Opcjonalnie możesz ukryć dane wyjściowe z STDERR:

grep -qi 'root' /etc/shadow &> /dev/null ; case "$?" in "0") echo "match" ;; "1") echo "no match" ;; *) echo "error: $?" ;; esac

Zostanie to wydrukowane error: 2z caseinstrukcji (zakładając, że nie mamy uprawnień do odczytu /etc/shadowlub że plik nie istnieje), ale komunikat o błędzie z grepzostanie przekierowany /dev/null, abyśmy go nigdy nie widzieli.

Charles Boyd
źródło