web-dev-qa-db-fra.com

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

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 ne se trouve pas dans le fichier/etc/passwd?

29
Chirag Vijay

grep renverra le succès s'il trouve au moins une instance du modèle et un échec dans le cas contraire. Vous pouvez donc soit ajouter une clause else si vous voulez à la fois des impressions "fait" et "ne fait pas", ou vous pouvez simplement annuler la condition if 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
53
Eric Renouf

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 grep ne parvient pas à trouver une correspondance, il quittera 1, donc $? sera 1. grep renverra toujours 0 en cas de succès. Il est donc plus sûr d'utiliser $? != 0 que $? == 1.

2
ssanch

Vous pouvez utiliser 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
1
Noam Manos

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.

1
matrik