大きなログファイル上のテキストの検索とフィルタリング

大きなログファイル上のテキストの検索とフィルタリング

ログ ファイルの検索には、tail、head、grep コマンドを使用します。ほとんどの場合、パイプの使用に加えて、これら 3 つのコマンドを組み合わせると、目的を達成できます。ただし、多数のデバイスが文字通り数秒ごとにレポートする 1 つのログがあります。そのため、このログは非常に大きくなります。ただし、レポートのパターンは同じです。

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

上記の例では、UDP パケットが特定のユニット ID のソケット サーバーに送信されたことを示しています。

ここで、ログをクエリして、特定の時間範囲内でのこのユニットのパケット情報を表示したい場合があります。

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

したがって、上記の例では、11:58 から 23:58 の時間範囲内で、ユニット ID: 1111 のログ出力のみを表示したいと思います。考えられる結果は次のようになります。

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

結果にはユニット ID: 1111 の情報のみが表示され、他のユニットは表示されないことに注意してください。

さて、次のようなものを使用すると問題が発生します:

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

必要なものだけでなく、たくさんのものが表示されることです。

答え1

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

関連情報