我使用 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}'