【发布时间】:2016-05-20 20:21:27
【问题描述】:
我有一个日志文件,我需要在其中输出 DATE 和一些状态代码。我也在使用||作为分隔符并从数据中删除不需要的符号。这是它的样子:
cat logfile.log | awk 'BEGIN { FS = "\\|\\|" } { gsub("/","-") sub(":", " ") gsub("\\[", "") gsub("\\+0000]", "")}; { print $15 $12 }' | uniq -c
这个输出:
22 25-Jan-2016 01:53:52 85.10.210.199
1 25-Jan-2016 01:53:52 66.249.93.77
18 25-Jan-2016 01:53:52 85.10.210.199
1 25-Jan-2016 01:53:52 88.232.191.231
在此之后我需要将时间转换为纪元并仍然打印列 $1 和 $3
我想实现:
22 1453686832 85.10.210.199
1 1453686832 66.249.93.77
18 1453686832 85.10.210.199
1 1453686832 88.232.191.231
我可以将日期转换为纪元,但我会丢失其他列。我怎样才能让它们也随着时间的推移而保留?
这是我的 RAW 日志文件:
[] || || || || [] || http || 40080 || 176.237.167.102 || [] || [-] || [0.072] || 176.237.167.102 || - || - || [25/Jan/2016:06:30:26 +0000] || "POST /checknewmsg HTTP/1.1" || 200 || 265 || 895 || "http://google.com/post” || "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36" || "-" || [TR]
【问题讨论】:
-
如果我通过 date -d"$date" +%s 打印日期,我会丢失第一列和第三列
-
如果你有 GNU awk 你可以使用strftime
-
同时显示你的原始数据,因为你的 awk 命令对于你得到的数据来说看起来有点复杂。
-
你有 GNU awk 吗? @123 - 你的意思是
mktime(),而不是strftime()。如果我们有strptime()但我们没有。无论如何,对于 OP:发布生成您发布的输出的示例输入。gsub()的第一个参数是一个正则表达式,顺便说一句,不是字符串,所以如果你将它传递给一个正则表达式,那么 awk 不必将字符串转换为正则表达式,因此你不需要双重转义元字符,例如你应该做gsub(/\[/, ""),而不是gsub("\\[", "")。现在,通过在需要正则表达式的地方使用字符串,您将自己和 awk 的工作加倍。 -
好的,所以现在您已经编辑了您的问题,但您只提供了 1 行输入,并且与预期输出的任何行都不对应。看,这非常简单 - 发布几行示例输入以及您希望从 该输入 获得的输出。不要向我们展示一组输入,然后再向我们展示您希望从完全不同的一组输入中获得的输出 - 这没有用。
标签: bash perl awk timestamp epoch