web-dev-qa-db-fra.com

Comment puis-je supprimer la sortie de grep, afin qu'elle ne renvoie que l'état de sortie?

J'ai la commande grep. Je recherche un mot clé dans un fichier, mais je ne veux pas afficher la correspondance. Je veux juste connaître l'état de sortie du grep.

65
jackass27

N'importe quel version compatible POSIX de grep a le commutateur -q pour le calme:

-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 peut-être 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
81
slm

Redirigez simplement la sortie de grep vers /dev/null:

grep sample test.txt > /dev/null

echo $?
6
cuonglm

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

Vous pouvez l'utiliser pour créer 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 STDERR comme ceci:

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

Cela imprimera error: 2 à partir de l'instruction case (en supposant que nous n'avons pas les privilèges pour lire /etc/shadow ou que le fichier n'existe pas) mais le message d'erreur de grep sera redirigé vers /dev/null donc on ne le voit jamais.

2
Charles Boyd

Si vous ne voulez pas voir la sortie any, vous devez rediriger stderr et stdout vers/dev/null. Les autres réponses sont bonnes mais ne suppriment pas les erreurs, telles que la tentative de lecture à partir d'un fichier inexistant ou illisible (par exemple, de mauvaises autorisations). Ajouter &> /dev/null (fonctionne en bash et quelques autres shells, mais pas tous; >/dev/null 2>&1 peut être plus portable) donc vous ne verrez aucune sortie.

$ ls thisfiledoesnotexist
ls: cannot access thisfiledoesnotexist: No such file or directory
$ grep foo thisfiledoesnotexist
grep: thisfiledoesnotexist: No such file or directory
$ grep -q foo thisfiledoesnotexist
grep: thisfiledoesnotexist: No such file or directory
$ grep foo thisfiledoesnotexist >/dev/null
grep: thisfiledoesnotexist: No such file or directory
$ grep foo thisfiledoesnotexist &>/dev/null
$ echo $?
2
$ touch nopermissions
$ chmod 000 nopermissions
$ grep -q foo nopermissions
grep: nopermissions: Permission denied
$ grep foo nopermissions > /dev/null
grep: nopermissions: Permission denied
$ grep foo nopermissions &> /dev/null
$ echo $?
2
$ 

Si vous avez déjà vérifié que le fichier cible existe et qu'il s'agit bien d'un fichier et que vous avez les autorisations pour le lire, ce n'est pas si important, mais si vous êtes un peu plus imprudent et avide récursivement ou que vous utilisez des caractères génériques, vous êtes plus susceptibles de voir la sortie sur stderr.

0
drewbenn