'tail -f' gibt keine einzelnen Zeilen aus, wenn sie durch grep geleitet werden '

7

Ich starte eine Website, und ich wollte einen Bash-One-Liner einrichten. Wenn also jemand auf die Seite kommt, würde er mit dem internen Summer piepen.

Bis jetzt funktioniert es mit den folgenden.

%Vor%

Tail folgt dem access_log und dumps auf STDOUT, ruft STDOUT-Zeile auf, gibt die Zeile mit '\ 007' "internem Piepton-Hex-Code" zurück und erledigt ...

Das funktioniert wie eine Schönheit ... Jeder Treffer zeigt die Linie vom Log und piept ... Allerdings wurde es sehr schnell nervig, also wollte ich das tail -f /access/log filtern, bevor es in das while piped ist so dass lesen nur Zeilen, die mir wichtig sind. Ich dachte, grep "/index.php" wäre ein guter Hinweis auf Besucher ...

Hier ist das Problem ...

Ich kann ...

%Vor%

piept auf alles und ich kann tun ...

%Vor%

und Seiten werden ohne Ton angezeigt, aber wenn ich das tue

%Vor%

Nichts passiert, keine Zeile aus dem Protokoll, kein Piepton.

Ich denke, der Grep bringt es irgendwo durcheinander, aber ich kann nicht herausfinden, wo. Ich würde es lieben, ein Einliner zu sein, und ich weiß, dass es wirklich in einem Drehbuch getan werden sollte und einfacher sein würde, aber es erklärt nicht, warum das oben genannte, was ich denke, nicht funktionieren sollte.

>     
Phil Poore 01.05.2013, 17:03
quelle

2 Antworten

14

Die Grep-Ausgabe wird gepuffert, wenn sie in einer Pipe verwendet wird. Verwenden Sie --line-buffered , um die Verwendung der Zeilenpufferung zu erzwingen, sodass Zeilen sofort ausgegeben werden.

%Vor%

Sie könnten auch die grep - und while -Schleife zu einem einzigen awk -Anruf kombinieren:

%Vor%     
John Kugelman 01.05.2013, 17:05
quelle
7

Grep puffert die Ausgabe, wenn die Standardausgabe kein Terminal ist. Sie müssen den Schalter --line-buffered an Grep übergeben, um zu erzwingen, dass die Standardausgabe beim Schreiben einer Zeile gelöscht wird.

    
cdhowie 01.05.2013 17:05
quelle

Tags und Links