Suchen und Filtern von Text in großen Protokolldateien

Suchen und Filtern von Text in großen Protokolldateien

Ich verwende die Befehle tail, head und grep, um Protokolldateien zu durchsuchen. Meistens reicht die Kombination dieser drei Befehle zusammen mit der Verwendung von pipe aus. Ich habe jedoch dieses eine Protokoll, an das viele Geräte buchstäblich alle paar Sekunden berichten. Dieses Protokoll ist also sehr groß. Aber das Muster der Berichterstattung ist dasselbe:

Oct 10 11:58:50 Received Packet from [xxx.xx.xxx.xx:xxxx]: 0xD 0xD 0xD 
Oct 10 11:58:50 Unit ID: 1111

Im obigen Beispiel wird gezeigt, dass ein UDP-Paket für eine bestimmte Geräte-ID an den Socket-Server gesendet wurde.

Jetzt möchte ich manchmal die Paketinformationen für diese Einheit innerhalb eines bestimmten Zeitraums anzeigen, indem ich das Protokoll abfrage.

Oct 10 11:58:50 Received Packet from [xxx.xx.xxx.xx:xxxx]: 0xD 0xD 0xD 
Oct 10 11:58:50 Unit ID: 1111

... // A bunch of other units reporting including unit id 1111

Oct 10 23:58:50 Received Packet from [xxx.xx.xxx.xx:xxxx]: 0x28 0x28 0x28 
Oct 10 23:58:50 Unit ID: 1111

Im obigen Beispiel möchte ich die Protokollausgabe nur für die Unit-ID: 1111 im Zeitraum zwischen 11:58 und 23:58 anzeigen. Die möglichen Ergebnisse können also wie folgt aussehen:

Oct 10 11:58:50 Received Packet from [xxx.xx.xxx.xx:xxxx]: 0xD 0xD 0xD 
Oct 10 11:58:50 Unit ID: 1111

Oct 10 12:55:11 Received Packet from [xxx.xx.xxx.xx:xxxx]: 0x28 0xD 0x28 
Oct 10 12:55:11 Unit ID: 1111

Oct 10 15:33:50 Received Packet from [xxx.xx.xxx.xx:xxxx]: 0x33 0xD 0x11 
Oct 10 15:33:50 Unit ID: 1111

Oct 10 23:58:50 Received Packet from [xxx.xx.xxx.xx:xxxx]: 0x28 0x28 0x28 
Oct 10 23:58:50 Unit ID: 1111

Beachten Sie, dass in den Ergebnissen nur die Informationen zur Einheiten-ID 1111 angezeigt werden und nicht die anderen Einheiten.

Nun zum Problem bei der Verwendung von so etwas:

tail -n 10000 | grep -B20 -A20 "Oct 10 23:58:50 Unit ID: 1111" 

ist, dass eine Menge Zeug angezeigt wird, nicht nur das, was ich brauche.

Antwort1

awk '$3 >= "11:58" && $3 <= "23:58" && /Unit ID: 1111/{print l"\n"$0};{l=$0}'

verwandte Informationen