Wie etwas mit Bash zu tun, wenn eine Textzeile in einer Datei erscheint
Frage
Ich mag so schnell einen Befehl auszuführen, wie ein bestimmte Text in einer Protokolldatei angezeigt wird. Wie kann ich tun, dass in Bash?
Lösung
Verwenden Befehl
tail -f file.log | grep --line-buffered "my pattern" | while read line
do
echo $line
done
Die --line-buffered
ist hier der Schlüssel, da sonst die Lese fehl.
Andere Tipps
Mit nur tail
:
tail -f file.log | while read line; do if [[ $line == *text* ]]; then
mycommand
fi; done
Dies sollte auch ohne GNU grep funktionieren:
tail -f -n 0 logfile.out | nawk '/pattern/ {system("echo do something here")}'
edit: Added "-n 0", so dass nur neue Vorkommen des Textes angepasst werden
. Auch könnten Sie bei inotail
suchen, ein Ersatz für tail -f
, die den inotify
Framework verwendet nur aufwachen, wenn die Datei, die Sie in sich geändert hat interessiert sind. Der üblicher tail -f
schläft nur für kurze Zeiträume zwischen der Abfrage, die eine effektive, aber nicht sehr effiziente Lösung ist.
Ich mag Matli Antwort. Bruno De Fraine Antwort ist auch gut, dass es verwendet nur Shell ccommands, nicht andere Programme (wie awk). Es leidet unter dem Problem, dass die gesamte Linie muss die magische Zeichenfolge übereinstimmen. Es ist nicht klar von der Frage, den Teil des requirment ist.
Ich würde ihm ein klein wenig ändern mit dem „sobald“ -Klausel in der ursprünglichen Frage zu tun
logfile_generator | tee logfile.out | nawk '/pattern/ {system("echo do something here")}'
wo logfile_generator ist das Programm, das die Protokolldatei in erster Linie erzeugt. Diese Modifikation führt die „etwas“, sobald der magische String befindet.