Definieren Sie einfach beep
wie folgt:
beep() { read a || exit; printf "$a\007\n"; beep; }
Dann können Sie Ihren Befehl verwenden:
tail -f development.log | grep "something rare" | beep
Ich möchte, dass mein PC bei jedem Ereignis einen Piepton ausgibt
Ich habe den folgenden Befehl
tail -f development.log | grep "something rare"
Gibt es eine einfache Möglichkeit, wie etwas zu Pfeifen? mögen
tail -f development.log | grep "something rare" | beep
Wenn ja, wird die grep-Ausgabe immer noch angezeigt?
Definieren Sie einfach beep
wie folgt:
beep() { read a || exit; printf "$a\007\n"; beep; }
Dann können Sie Ihren Befehl verwenden:
tail -f development.log | grep "something rare" | beep
Der GNU-Bildschirm verfügt über eine integrierte Funktion, die einen Piepton ausgibt, wenn sich ein bestimmtes Fenster ändert: siehe den entsprechenden Abschnitt der Manpage .
Schlagzeilenzusammenfassung:
$ screen $ tail -f yourfile.log # inside the screen session <C-a> M # "Window 0 (bash) is now being monitored for all activity."
Wie in den Kommentaren darauf hingewiesen wurde, ertönt bei jedem neuen Protokolleintrag ein Piepton, nicht nur bei den Einträgen, die mit "etwas Seltenem" übereinstimmen. Dies macht also nicht ganz das, was das OP verlangt. Immer noch ein nützlicher Trick, um IMHO zu erfahren.
Sie können das Beste aus beiden Welten nutzen, indem Sie zwei screen
Fenster <C-a> c
öffnen ( um ein Fenster zu öffnen, <C-a> <C-a>
um zwischen zwei Fenstern zu wechseln):
tail -f yourfile.log | grep 'something rare'
tail -f yourfile.log
Dann können Sie sich das Fenster vorbeiziehen und in Fenster 2 vorbeirollen, und aus Fenster 1 wird ein Piepton ausgegeben, wenn "etwas Seltenes" auftritt.
screen
ist unglaublich vielseitig - ich kann es sehr empfehlen, sich darüber zu informieren.
Sie können verhindern, dass die Ausgabe im Befehl grep zwischengespeichert wird. Siehe man grep für Details.
Sie können die grep-Ausgabe in einen Piepton leiten.
Das folgende Beispiel ist von Mann Piep ...
As part of a log-watching pipeline tail -f /var/log/xferlog | grep --line-buffered passwd | \ beep -f 1000 -r 5 -s
Diese Handbücher enthalten eine Menge guter Dinge. Wenn wir sie nicht nur lesen müssten, um es zu finden. ;-)
Der Befehl watch hat die Option --beep, und Sie können auch das Abrufintervall einstellen. Der Standardwert mit 2 Sekunden sollte jedoch in Ordnung sein
watch --beep 'tail development.log | grep "something rare"'
Sie können sed verwenden, um das Control-G wie folgt hinzuzufügen:
tail -f myFile | sed "s/.*/&\x07/"
oder nur auf seltenen Zeilen, ohne grep wie folgt zu verwenden:
tail -f myFile | sed -n "/something rare/s/.*/&\x07/p"
die sagt: auf den Linien, wo etwas selten vorkommt, s ubstitute alles für den gleichen Stoff mit Steuer-G am Ende geheftet und drucken (aber nicht gedruckt, die nicht passenden Linien). Funktioniert super!
Hm, knifflig. Wir könnten vielleicht so etwas tun?
for i in `find | grep 7171`; do beep; echo $i; done
Oder in deinem Fall
for i in `tail -f development.log | grep "something rare"`; do beep; echo $i; done
Es scheint jedoch etwas zu puffern. Ich werde nachsehen, ob es eine Möglichkeit gibt, diese Pufferung durch die for
Schleife zu deaktivieren.
Anscheinend sollten Sie in der Lage sein, die Pufferung der Pipe durch Verwendung anzupassen, ulimit -p
aber dies beschwert sich immer wieder über ungültiges Argument für mich. Ich habe auch einen Beitrag gefunden, der behauptet, dass Sie den Kernel neu kompilieren müssen, um dieses Limit zu ändern.
In einem früheren Job konnte ich mit Command-Fu keinen zuverlässigen Beobachter finden. Daher hatte ich ein Wrapper-Skript wie das unten stehende, das die Datei alle Sekunden von poll_duration inspizierte und die neuen Zeilen für die interessierte Phrase suchte.
#!/bin/bash file=$1 phrase=$2 poll_duration=$3 typeset -i checked_linecount typeset -i new_linecount typeset -i new_lines let checked_linecount=new_linecount=new_lines=0 echo "Watching file $file for phrase \"$phrase\" every $poll_duration seconds" while [ 1 ] do let new_linecount=`wc -l $file| awk ''` if [[ $new_linecount > $checked_linecount ]]; then let "new_lines = $new_linecount-$checked_linecount" head --lines=$new_linecount "$file" | tail --lines=$new_lines | grep "$phrase" && beep let checked_linecount=$new_linecount fi sleep $poll_duration done
Dies war auf einem Unix-Rechner. Unter Linux können Sie mit der inotify filewatcher-Schnittstelle noch bessere Ergebnisse erzielen. Wenn dieses Paket ( inotify-tools unter Ubuntu) vorhanden ist, ersetzen Sie es
sleep $poll_duration
mit
inotifywait -e modify "$file" 1>/dev/null 2>&1
Dieser Aufruf blockiert, bis die Datei geändert wird. Die Blockierungsversion ist fast so effizient wie die tail -f
Version, wenn Pipe ohne Pufferung konfiguriert werden kann.
Hinweis: Das Skript führt zuerst ein aus, head --lines=$new_linecount
um sicherzustellen, dass Zeilen, die der Datei hinzugefügt werden, nachdem wir sie überprüft haben, den Block der Datei, die in dieser Schleife geprüft wird, nicht verzerren.