如何用awk或sed解析/过滤日志行

时间:2013-07-30 21:07:35

标签: heroku sed awk

我试图找出如何使用awk,sed或其他工具过滤heroku日志排水渠。正如您可以看到下面的示例,该命令仅过滤与grep相关的router行。但我无法弄清楚如何过滤其余部分。

heroku logs -t | grep router | ???

  

2013-07-20T20:44:40.855998 + 00:00 heroku [router]:at = info method = GET path = / oauth2 / callback?error = access_denied host = app.herokuapp.com fwd =“123.234.456.78 “dyno = web.5 connect = 1ms service = 55ms status = 302 bytes = 5

     

2013-07-20T20:44:40.855998 + 00:00 heroku [router]:at = info method = GET path = / oauth2 / callback / succesuser =%7B%22user%3Aexample%40example.com%22%2C %22force%22%3Afalse%7D host = app.herokuapp.com fwd =“123.234.456.78”dyno = web.5 connect = 1ms service = 312ms status = 302 bytes = 5

问题1)有一部分提供了有关日志行中服务时间的详细信息:(示例中的service=55msservice=312ms)假设我想要只看到服务时间超过300毫秒的人。我该如何实现呢?

可选问题)我是否有可能将这些逗号分隔的行格式化为:timestamp,path,service

可选问题的示例输出:

  

2013-07-20 20:44:40,/ oauth2 / callback?error = access_denied,55`

     

2013-07-20 20:44:40,/ oauth2 / callback / succesuser =%7B%22user%3Aexample%40example.com%22%2C%22force%22%3Afalse%7D,312`

2 个答案:

答案 0 :(得分:1)

看看这个sed表达式是否有用:

sed '/[3-9][0-9][0-9][m][s]/!d'
sed '/[3-9][0-9][0-9][m][s]/!d

以下是一个例子:

printf '301ms\n300ms\n302ms\n200ms\n40ms' | sed '/[3-9][0-9][0-9][m][s]/!d'

=> 301ms
=> 300ms
=> 302ms

要仅获得更多超过300毫秒的那些行,请改为使用:

sed '/[3-9][0-9][1-9]/!d'  

另一个例子:

printf '301ms\n300ms\n302ms\n200ms\n40ms' | sed '/[3-9][0-9][1-9][m][s]/!d'

=> 301ms
=> 302ms

上面的原因 - 这个/[3-9][0-9][1-9]/!d - 也会过滤掉小于300的数字,这是因为!标志性的东西 - 它告诉sed删除所有没有的行匹配模式[3-9][0-9][1-9][m][s]

答案 1 :(得分:1)

使用awk。把它放在文件awk0:

BEGIN       {OFS = ","}

            {split($10,arr,"\="); time = arr[2] + 0}

time > 300  {print $1, $5, time}

然后这应该有效:

heroku logs -t | grep router | awk -f awk0
祝你好运!