
我使用 tail、head 和 grep 命令來搜尋日誌檔案。大多數時候,除了使用管道之外,這 3 個命令的組合也可以完成工作。然而,我有一個日誌,許多設備幾乎每隔幾秒鐘就會報告一次。所以這個日誌非常大。但報告的模式是相同的:
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 時間範圍內 Unit 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}'