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?

Chirag Vijay
la source

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
Eric Renouf
la source
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.

ssanch
la source
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.

matrik
la source
0

Vous pouvez utiliser l' option grep "-L / --files-without-match" , pour vérifier si le fichier ne contient pas de chaîne:

if [[ $(grep -L "$user2" /etc/passwd) ]]; then   
  echo "User does not exist!!"; 
fi
Noam Manos
la source