Comment utiliser grep lorsque le fichier ne contient pas la chaîne


26

Dans mon script bash, j'essaie d'imprimer une ligne si une certaine chaîne n'existe pas dans un fichier.

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"

Voici comment je l'ai écrit si je voulais que la chaîne existe dans le fichier, mais comment puis-je la modifier pour qu'elle s'affiche "l'utilisateur n'existe pas" si l'utilisateur n'est pas trouvé dans le fichier / etc / passwd?

Réponses:


49

grepretournera le succès s'il trouve au moins une instance du modèle et l'échec s'il ne le fait pas. Vous pouvez donc soit ajouter une elseclause si vous voulez à la fois des impressions "ne" et "ne pas", ou vous pouvez simplement annuler la ifcondition pour n'obtenir que des échecs. Un exemple de chacun:

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"
else
    echo "User does not exist!!"
fi

if ! grep -q "$user2" /etc/passwd; then
    echo "User does not exist!!"
fi

2

Une alternative consiste à rechercher l'état de sortie de grep. Par exemple:

grep -q "$user2" /etc/passwd
if [[ $? != 0 ]]; then
    echo "User does not exist!!"

Si grepne parvient pas à trouver une correspondance, il se fermera 1, il en $?sera de même 1. grepreviendra toujours en 0cas de succès. Il est donc plus sûr d'utiliser $? != 0que $? == 1.


c'est vraiment juste une façon plus longue de dire ce que Eric a dit .
Jeff Schaller

Eh bien, pour moi, la if ! grep ...déclaration négative n'a pas fonctionné. C'est donc une alternative.
ssanch

1

Je le résous avec un simple liner:

for f in *.txt; do grep "tasks:" $f || echo $f; done

La commande vérifie tous les fichiers du répertoire avec l'extension txt et écrit la chaîne de recherche (c'est-à-dire "tâches:") si elle est trouvée ou bien le nom du fichier.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.