代码之家  ›  专栏  ›  技术社区  ›  SScast

awk日志文件中的日期到历元,并打印其他列

  •  -1
  • SScast  · 技术社区  · 8 年前

    我有一个日志文件,需要在其中输出日期和一些状态代码。我还使用||作为分隔符,并从数据中删除不需要的符号。下面是它的样子:

    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
    

    我可以将日期转换为历元,但我会丢失其他列。我怎样才能用转变的时间来保存它们呢?

    这是我的原始日志文件:

    [] ||  ||  ||  || [] || 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]
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Ed Morton    8 年前

    由于您有点不愿意在问题中提供所需的信息,请确认这是否是您想要的,但GNU awk 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