web-dev-qa-db-fra.com

Script Bash - Vérifiez si un fichier contient une ligne spécifique

Je dois vérifier si un fichier contient une ligne spécifique. Ce fichier est écrit continuellement par quelqu'un, donc j'ai mis le chèque dans une boucle while.

FILE="/Users/test/my.out"
STRING="MYNAME"
EXIT=1
while [ $EXIT -ne 0 ]; do 
    if [ -f $FILE ] ; then CHECK IF THE "STRING" IS IN THE FILE - IF YES echo "FOUND"; EXIT=0; fi
done

Le fichier contient du texte et plusieurs lignes.

15
user3472065

si $FILE contient le nom du fichier et $STRING contient la chaîne à rechercher, vous pouvez alors afficher si le fichier correspond à l'aide de la commande suivante:

if [ ! -z $(grep "$STRING" "$FILE") ]; then echo "FOUND"; fi
13
fstab

Interroge l'heure de modification du fichier et grep pour la chaîne lorsqu'elle change:

while :; do
    a=$(stat -c%Y "$FILE") # GNU stat
    [ "$b" != "$a" ] && b="$a" && \
        grep -q "$STRING" "$FILE" && echo FOUND
    sleep 1
done

Remarque: les utilisateurs BSD doivent utiliser stat -f%m

6
Cole Tierney

Essayer:

while : ;do
    [[ -f "$FILE" ]] && grep -q "$STRING" "$FILE" && echo "FOUND" && break
done

Cela bouclera en continu sans attendre, vous voudrez peut-être ajouter une période d'attente (par exemple 5 secondes dans cet exemple):

while : ;do
    [[ -f "$FILE" ]] && grep -q "$STRING" "$FILE" && echo "FOUND" && break
    sleep 5
done
4
Josh Jolly

Une vérification plus rigoureuse pour tester si un ligne $ STRING donné est contenu dans un fichier FILE serait

awk '$0 == "'${STRING}'"' $FILE

Cela répond en particulier à mes préoccupations concernant la réponse de @ fstab (qui s'applique également à toutes les autres réponses précédentes): il vérifie la ligne complète et pas seulement la présence de sous-chaîne dans une ligne (comme cela est fait avec les solutions grep ci-dessus).

La boucle pourrait être effectuée comme indiqué dans les autres réponses.

2
Holger Brandl