我试图找出如何使用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=55ms
和service=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`
答案 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
祝你好运!