我有以下结构的日志:
2016-07-06 06:53:35,764 INFO com.myown.filter.BaseLoggingFilter log 777 * Server responded with a response on thread ajp-bio-8009-exec-1
777 < 501
777 < Content-Type: application/json
2016-07-06 07:00:00,820 INFO com.myown.filter.BaseLoggingFilter log 778 * Server has received a request on thread ajp-bio-8009-exec-2
778 > GET https://webservice/endpoint
778 > accept: */*
778 > Accept-Encoding: gzip,deflate
778 > authorization: ***[MASKED]***
778 > connection: Keep-Alive
778 > content-length: 0
778 > host: webservice
778 > user-agent: Apache-HttpClient/4.3.6 (java 1.5)
我正在寻找一种方法来按时间过滤这些条目。假设我想在07 AM之前收到所有参赛作品。
我设法写了以下内容:
cat webservice.log | awk '$2~/([01]?[0-9]|2[0-3]:[0-5][0-9]:[0-5][0-9])/ && $2 < "07:00:00"'
这只会打印出包含日期和时间的行。
2016-07-06 06:53:35,764 INFO ...
现在我还想要包含与请求相对应的其他行。
我尝试过使用变量,但我无法弄明白。下面的代码片段我通过谷歌搜索拙劣,但它无法正常工作。
cat webservice.log | awk '$2~/([01]?[0-9]|2[0-3]:[0-5][0-9]:[0-5][0-9])/ && $2 > "00:00:00" {p=1}
$2~/([01]?[0-9]|2[0-3]:[0-5][0-9]:[0-5][0-9])/ && $2 < "07:00:00" {p=0}
p {print $0}'
我希望这段代码能够做什么:
因此,当第二个字段是时间,并且它大于00:00:00时,p = 1并且将打印该行。如果以下行没有找到日期,它们也只是打印出来(因为p仍为1)。如果第二个字段是时间,但是大于07:00:00时出现一行,则p将变为0,并且这些行将停止打印。
但这不起作用。我对AWK工作原理的理解可能有些不对。
谢谢!
答案 0 :(得分:0)
我看到您的日志条目由空行分隔。我们可以用它来分隔下一个条目:
$ awk -F'[ :]+' '$2<7' RS="" logfile
2016-07-06 06:53:35,764 INFO com.myown.filter.BaseLoggingFilter log 777 * Server responded with a response on thread ajp-bio-8009-exec-1
777 < 501
777 < Content-Type: application/json
-F'[ :]+'
这会将字段分隔符设置为任意数量的空格或冒号。使用此设置,第一个字段是日期,第二个字段是小时,第三个字段是分钟等。
$2<7
这将打印小时字段$ 2小于7的任何记录。
RS=""
这告诉awk将空白行分隔的段落作为一个记录读取。因此,单个打印会导致打印出整个条目(记录),而不仅仅是第一行。