awk 日期到日志文件中的纪元并打印其他列
Posted
技术标签:
【中文标题】awk 日期到日志文件中的纪元并打印其他列【英文标题】:awk date to epoch in log file and print other columns also 【发布时间】: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 行输入,并且与预期输出的任何行都不对应。看,这非常简单 - 发布几行示例输入以及您希望从 该输入 获得的输出。不要向我们展示一组输入,然后再向我们展示您希望从完全不同的一组输入中获得的输出 - 这没有用。
【参考方案1】:
由于您有点不愿意在您的问题中提供所要求的信息,如果这就是您要查找的内容,请确认您是否正在寻找,但使用 GNU awk for mktime()
:
$ cat tst.awk
BEGIN FS="\\s*[|][|]\\s*"
split($15,a,/[][\/: ]/)
a[3] = (match("JanFebMarAprMayJunJulAugSepOctNovDec",a[3])+2)/3
secs = mktime(a[4]" "a[3]" "a[2]" "a[5]" "a[6]" "a[7])
cnt[secs OFS $12]++
END
for (key in cnt)
print cnt[key], key
$ cat file
[] || || || || [] || 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]
$ awk -f tst.awk file
1 1453725026 176.237.167.102
【讨论】:
是的,但我需要计算 uniq 时间戳的行数,而不是 IP 地址,即使它们已打印。我正在使用 GNU awk。非常感谢! 因此,再次(也是最后一次)编辑您的问题以提供示例输入和给定输入的预期输出。特别包括一个情况,即您有多个 IP 地址用于 1 个时间戳,因为您根本没有描述在这种情况下对输出的要求,并且您可能希望以多种方式处理它。以上是关于awk 日期到日志文件中的纪元并打印其他列的主要内容,如果未能解决你的问题,请参考以下文章