Je veux exécuter une commande dès qu'un certain texte apparaît dans un fichier journal. Comment est-ce que je fais ça dans Bash?Comment faire quelque chose avec Bash lorsqu'une ligne de texte apparaît dans un fichier
Répondre
Utilisez la commande
tail -f file.log | grep --line-buffered "my pattern" | while read line
do
echo $line
done
Le --line-buffered
est la clé ici, sinon la lecture échouera.
Cela devrait fonctionner même sans GNU grep:
tail -f -n 0 logfile.out | nawk '/pattern/ {system("echo do something here")}'
modifier: Ajout "-n 0" de sorte que seuls les nouveaux occurences du texte seront jumelés.
En utilisant seulement tail
:
tail -f file.log | while read line; do if [[ $line == *text* ]]; then
mycommand
fi; done
J'aime la réponse de Matli. La réponse de Bruno De Fraine est également bonne car elle n'utilise que des ccommands de shell, pas d'autres programmes (comme awk). Il souffre du problème que toute la ligne doit correspondre à la chaîne magique. Ce n'est pas clair à partir de la question qui fait partie de la demande.
Je modifierais un tout petit peu pour faire face à la « dès que » clause de la question initiale
logfile_generator | tee logfile.out | nawk '/pattern/ {system("echo do something here")}'
où logfile_generator est le programme qui génère le fichier journal en premier lieu. Cette modification exécute le "quelque chose" dès que la chaîne magique est localisée.
Vous pouvez également regarder inotail
, un remplacement pour tail -f
qui utilise le cadre inotify
pour se réveiller uniquement lorsque le fichier qui vous intéresse a changé. L'habituel tail -f
dort juste pendant de courtes périodes de temps entre les sondages, ce qui est une solution efficace mais pas très efficace.
Ma solution correspond à n'importe quelle ligne qui contient du "texte" (c'est ce que fait le modèle * texte *), et pas seulement des lignes égales à "texte". Voir la description du composé [[]] et == dans le manuel de Bash. –