awk按时间过滤行

时间:2016-07-06 07:44:34

标签: awk

我有以下结构的日志:

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工作原理的理解可能有些不对。

谢谢!

1 个答案:

答案 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将空白行分隔的段落作为一个记录读取。因此,单个打印会导致打印出整个条目(记录),而不仅仅是第一行。