Comment puis-je supprimer la sortie de grep afin qu'elle ne renvoie que le statut de sortie?

57

J'ai le grepcommandement Je cherche un mot-clé dans un fichier, mais je ne souhaite pas afficher la correspondance. Je veux juste connaître le statut de sortie du grep.

jackass27
la source

Réponses:

69

Toutes les versions compatibles POSIXgrep du commutateur sont -qsilencieuses:

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

Dans GNU grep (et éventuellement d’autres), vous pouvez également utiliser des synonymes à option longue:

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

Exemple

La chaîne existe:

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

La chaîne n'existe pas:

$ echo "here" | grep -q "not here"
$ echo $?
1
slm
la source
6

Il suffit de rediriger la sortie de grepvers /dev/null:

grep sample test.txt > /dev/null

echo $?
cuonglm
la source
1
Cela échouera echo $?si greprenvoie un code de sortie non nul.
WinnieNicklaus
2

Vous devez simplement combiner grep -q <pattern>avec une vérification immédiate du code de sortie du dernier processus à quitter ( $?).

Vous pouvez utiliser ceci pour construire une commande comme celle-ci, par exemple:

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

Vous pouvez éventuellement supprimer la sortie de la STDERRmanière suivante:

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

Cela imprimera à error: 2partir de la casedéclaration (en supposant que nous n’ayons pas de privilèges à lire /etc/shadowou que le fichier n’existe pas), mais le message d’erreur de grepsera redirigé afin /dev/nullque nous ne le voyions jamais.

Charles Boyd
la source