2016-06-24 16 views
0

eine Protokolldatei wie Having:Autostart-Leerzeilen in `tail -f`

[DEBUG][2016-06-24 11:10:10,064][DataSourceImpl] - [line A...] 
[DEBUG][2016-06-24 11:10:10,069][DataSourceImpl] - [line B...] 
[DEBUG][2016-06-24 11:10:12,112][DataSourceImpl] - [line C...] 

die unter tail -f Überwachung in Echtzeit ist, ist es möglich, Auto-Einsatz (über einen Befehl würden wir Rohr an die tail) "Leerzeilen" nach, sagen wir, 2 Sekunden Inaktivität?

Erwartetes Ergebnis:

[DEBUG][2016-06-24 11:10:10,064][DataSourceImpl] - [line A...] 
[DEBUG][2016-06-24 11:10:10,069][DataSourceImpl] - [line B...] 
--- 
[DEBUG][2016-06-24 11:10:12,112][DataSourceImpl] - [line C...] 

(weil es eine Lücke von mehr als 2 Sekunden zwischen 2 aufeinanderfolgenden Zeilen).

Antwort

1
awk -F'[][\\- ,:]+' '1' 

Die oben wird aufgeteilt Felder auf ], [, -, ,, und :, so dass jedes Feld, wie unten beschrieben wird:

[DEBUG][2016-06-24 11:10:10,064][DataSourceImpl] - [line A...] 
22222 3333 44 55 66 77 88 999 ... 

Sie können dann einige der Felder verketten und damit den Zeitunterschied messen:

tail -f input.log | awk -F'[][\\- ,:]+' '{ curr=$3$4$5$6$7$8$9 } 
         prev + 2000 < curr { print "" } # Print empty line if two seconds 
                 # have passed since last record. 
             { prev=curr } 1' 
+0

Wunderbar kurz! Vielen Dank für dieses schöne Kunstwerk. – user3341592

+0

Ich weiß, ich habe einige mehrzeilige "Ereignisse", dh erste Zeile mit Zeitstempel und alle; folgende Zeilen ohne Präfix Wie kannst du das berücksichtigen? – user3341592

+0

Dieses Verhalten verhält sich während der DST- oder Schalttag- oder Schaltsekundenübergänge nicht wie erwartet. Das könnte in Ordnung sein, aber etwas zu beachten. –

0

tail hat keine solche Funktion. Wenn Sie möchten, können Sie ein Programm oder Skript implementieren, das die letzte Zeile der Datei überprüft. so etwas wie (Pseudo-Code)

previous_last_line = last line of your file 
while(sleep 2 seconds) 
    { 
    if (last_line == previous_last_line) 
     print newline 
    else 
     print lines since previous_last_line 
    } 

Zwei Bemerkungen:

  • dies führt dazu, dass Sie keine Ausgabe während 2 Sekunden haben; Du könntest öfter nach der letzten Zeile suchen und einen Zeitstempel behalten; aber das erfordert mehr Code ...
  • das hängt davon ab, dass alle Zeilen eindeutig sind; was in deinem Fall vernünftig ist; da Sie Zeitstempel in jeder Zeile
+0

In der Tat sollte das Skript nicht 2 Sekunden warten. Sie können jedoch zuerst eine Leerzeile einfügen, wenn 2 Sekunden oder länger keine Aktivität im Protokoll vorhanden war. – user3341592

+0

Ich weiß, das ist ein "unerwünschter Nebeneffekt" des von mir vorgeschlagenen Skripts. Wie ich sagte; Sie können sich eine andere Möglichkeit vorstellen, dies zu verarbeiten; häufigeres Überprüfen der letzten Zeile der Datei; und Ausgabe jeder Zeile, wie Sie es sehen; den Zeitstempel des letzten Mals halten, als du eine Zeile gesehen hast, ... aber das könnte sehr schnell ressourcenhungrig werden ... –