2013-01-16 12 views
13

Ich versuche ein Shell-Skript zu erstellen, um einige Protokolldateien zu überwachen. Ich bin wie folgt ein Befehl:Tail -f in Grep in Schnitt funktioniert nicht richtig

tail -f /var/somelog | grep --line-buffered " some test and p l a c e h o l d e r" | cut -f 3,4,14 -d " " 

die Log-Datei ist wie:

some test and p l a c e h o l d e r 3 
some test and p l a c e h o l d e r 4 
some test and p l a c e h o l d e r 5 
some test and p l a c e h o l d e r 6 

und so weiter .. Mein Problem ist, dass die Ausgabe des Befehls nicht die letzte nicht angezeigt Linie

some test and p l a c e h o l d e r 6 

bis Linie

some test and p l a c e h o l d e r 7 

wird zum Protokoll hinzugefügt.

Ich hoffe, ich habe mein Problem klar gemacht. Kann mir jemand helfen, das zu lösen? Danke :)

+4

Vielleicht werden die Protokollzeilen nicht mit einem Zeilenvorschub beendet, sondern stattdessen mit einem gestartet? In diesem Fall wäre Zeile 6 nicht wirklich vollständig, bis Zeile 7 startet und diesen Zeilenvorschub bereitstellt. Wenn Sie sich die Protokolldatei mit allen Zeichen ansehen, sehen Sie am Ende der letzten Zeile einen Zeilenvorschub? –

+0

Suchen Sie nach einer abschließenden neuen Zeile ("\ n") mit 'od -c/var/somelog'. – cdarke

+0

Siehst du die gleiche Ausgabe mit nur 'tail -f'? Wenn das der Fall ist, hat @David es richtig angegeben. – mtk

Antwort

19

das Problem ist fast sicher, wie Grep und Cut-Puffer ihren Ausgang verwandt. hier ist ein Hack, dass Sie das Problem bekommen sollte, obwohl ich sicher bin, es gibt schönere Möglichkeiten, es zu tun:

tail -f /var/somelog | while read line; do echo "$line" | grep "some test and p l a c e h o l d e r" | cut -f 3,4,14 -d " "; done 

(nicht die ; done am Ende des Befehls vergessen)

alternativ , weil gawk nicht Puffer funktioniert es ausgegeben ist, können Sie es anstelle von cut verwenden die umständliche while-Schleife zu vermeiden:

tail -f log | grep --line-buffered "some test and p l a c e h o l d e r" | gawk '{print $3,$4,$14}' 

Check-out http://www.pixelbeat.org/programming/stdio_buffering/ für weitere Informationen über Pufferung Probleme.

+1

Es ist auch ziemlich wahrscheinlich, dass alles, was in '/ var/somelog' schreibt, puffert, so dass' tail' möglicherweise keine Änderungen sieht, bis es einen Puffer überläuft oder seine Ausgabe auf andere Weise löscht ... – twalberg

+0

Ich habe die erste Lösung ausprobiert und arbeitet. Danke für Ihre Hilfe! –

+0

froh zu helfen. Vergiss nicht, dass der beste Weg um hier Danke zu sagen darin besteht, hilfreiche Antworten zu akzeptieren! :) – nullrevolution