【问题标题】:awk date to epoch in log file and print other columns alsoawk 日期到日志文件中的纪元并打印其他列
【发布时间】: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


【解决方案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 个时间戳,因为您根本没有描述在这种情况下对输出的要求,并且您可能希望以多种方式处理它。
猜你喜欢
  • 2012-04-28
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 2012-11-28
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
相关资源
最近更新 更多