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 日期到日志文件中的纪元并打印其他列的主要内容,如果未能解决你的问题,请参考以下文章

awk查找指定行指定列的数据 并输出到文件

搜索日志文件以获取 2 个纪元时间之间的条目范围

awk 模式可以匹配多行吗?

如何将Hibernate生成的SQL语句打印到日志文件

Bash:使用awk从文件中获取的日期时间字符串获取纪元时间

根据变更日志创建从/到日期列