wie man bei tail -f event piept

8135
Jakob Cosoroaba

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?

13
Es gibt ein Beep-Programm mit dem Standard-Repo für Debian und Varianten, die nur apt-get install beep enthalten. Dies funktioniert jedoch nicht mit dem Piping Jakob Cosoroaba vor 14 Jahren 0

7 Antworten auf die Frage

14
mouviciel

Definieren Sie einfach beepwie 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 
Sorry, aber das funktioniert nicht, es piept nicht oder druckt irgendetwas Jakob Cosoroaba vor 14 Jahren 0
Obwohl die direkte Ausgabe von tail -f sofort erfolgt, wird sie gepuffert, sobald sie eine Pipe durchläuft. Sie müssen auf genug "etwas Seltenes" warten, bevor Sie etwas beobachten. mouviciel vor 14 Jahren 3
Sie könnten die Ausgabe durch "sed" oder ähnliches (zwischen tail und grep) übergeben, um mit einem Regex das "etwas Seltenes" oft durch sich selbst zu ersetzen. Wie oft dies erforderlich ist, hängt davon ab, wie viel Pipe gepuffert wird. David Spillett vor 14 Jahren 0
@David - Das ist ein Hit-and-Miss-Ansatz. Wenn Sie die über eine Pipe übergebenen Daten freigeben möchten, verwenden Sie eine der in den folgenden Antworten beschriebenen Methoden: http://stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe nagul vor 14 Jahren 6
Ausgehend von @ naguls Vorschlag, hier ist der Aufruf, der für mich funktioniert hat: `tail -f development.log | stdbuf -oL -eL grep "etwas seltenes" | Piepton " GuitarPicker vor 7 Jahren 1
Verwenden Sie `read -r`, um ein Verkleinern von Backslashes zu vermeiden, und` printf '% s \ 007 \ n' "$ a" `, um zu vermeiden, dass prozentuale Abweichungen in der Ausgabe interpretiert werden. Ich glaube auch nicht, dass der Schlussruf notwendig ist (und ich bin mir nicht sicher, ob Bash ihn wegoptimieren wird). tun …; stattdessen. Lucas Werkmeister vor 5 Jahren 0
9
Sam Stokes

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 screenFenster <C-a> cöffnen ( um ein Fenster zu öffnen, <C-a> <C-a>um zwischen zwei Fenstern zu wechseln):

  1. überwacht mit tail -f yourfile.log | grep 'something rare'
  2. nicht überwacht, mit einer Ebene 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.

Das würde nicht nur bei "etwas Seltenem" piepen, oder? nagul vor 14 Jahren 1
Wenn das alles in diesem Fenster passiert wäre, wäre `tail -f yourfile.log | grep etwas \ rare` und nicht nur das 'tail -f logfile' David Spillett vor 14 Jahren 0
Hoppla, ich habe nicht gemerkt, dass er nur einen Piepton bei "etwas Seltenem" wollte. Redigiert, um dies zu reflektieren. Der Grep würde funktionieren, aber dann würde er den Rest des Protokolls nicht sehen, nur die seltenen Zeilen - so wie ich es verstehe, möchte er das gesamte Protokoll vorbeirollen sehen können, aber bei bestimmten Ereignissen gewarnt werden. Sam Stokes vor 14 Jahren 0
1
A reader

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. ;-)

1
oanoss

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"' 
Beachten Sie, "watch" funktioniert, indem Sie Ihren Parameter / Befehl alle (Intervall-) Abschnitte ausführen und dann die Ergebnisse zum vorherigen Durchlauf bringen. Daher sollten Sie die normale Version des Befehls tail verwenden, anstatt `tail -f 'zu verwenden RyanWilcox vor 11 Jahren 1
Das funktionierte nicht für mich (trotz Hinzufügen von "watch - beep" und Einwickeln meines Schwanzes / Grep bekam ich immer noch keinen Piepton). machineghost vor 5 Jahren 0
1
Mi5ke

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!

0
Ivan Vučica

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 forSchleife zu deaktivieren.

Anscheinend sollten Sie in der Lage sein, die Pufferung der Pipe durch Verwendung anzupassen, ulimit -paber 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.

0
nagul

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 -fVersion, wenn Pipe ohne Pufferung konfiguriert werden kann.

Hinweis: Das Skript führt zuerst ein aus, head --lines=$new_linecountum 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.