2008-10-01 7 views

Répondre

14

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.

1

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.

5

En utilisant seulement tail:

tail -f file.log | while read line; do if [[ $line == *text* ]]; then 
    mycommand 
fi; done 
0

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.

+2

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. –

1

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.

Questions connexes