AWK - 是否可以通过一个不同的字段来分解日志文件&&按小时计算

时间:2016-06-24 18:48:31

标签: awk gawk

问题

  

我试图找出是否可以单独使用awk传入   一个日志文件,然后让awk输出一个带有的不同消息   小时(00-23)的细分以及该特定的计数   小时与不同的消息。

实施例

请求输出

Message1
00 13
01 30
...
23 6

Message2
00 50
01 10
...
23 120
etc, etc

输入文件看起来有点如下:

blah,blah
2016-06-24 00:30:54 blah Message1 7 rand rand2
2016-06-24 00:40:12 blah Message2 35 rand rand2
2016-06-24 00:42:15 blah Message2 12 rand rand2
2016-06-24 00:58:01 blah Message1 5 rand rand2
2016-06-24 00:58:12 blah Message2 3 rand rand2
2016-06-24 01:02:25 blah Message2 2 rand rand2
2016-06-24 01:02:30 blah Message1 3 rand rand2
2016-06-24 01:05:14 blah Message1 10 rand rand2
2016-06-24 01:30:56 blah Message2 5 rand rand2
2016-06-24 01:55:41 blah Message2 3 rand rand2
blah, blah

请注意,这是一个弥补的输入文件。

要获取此输入文件所请求的输出,我知道我需要print $4然后在新行上执行print substr($2,1,2)" "sum[$5]之类的操作。对于相同的$4小时,我必须将$4添加到一起。

代码

另请注意,我必须使用awk 3.1.7,所以我不能做任何奇特的新内容awk 4.1.0 +。

我知道如何获取不同的消息。

{
msg[$4]++
}
END {
  for (m in msg) {
     print m;
   }
}

要回到小时,我可以按照以下方式做点什么:

{
msg[$4]++
hr[$4] = substr($2,1,2)
}
END {
  for (m in msg) {
     print m;
     print hr[m];
   }
}

最后,对于总和来说,这将是:

{
msg[$4]++
hr[$4] = substr($2,1,2)
sum[$4] += $5
}
END {
  for (m in msg) {
     print m;
     print hr[m]" "sum[m];     
   }
}

非常感谢任何和所有帮助。

1 个答案:

答案 0 :(得分:2)

你想要的东西是:

$ cat tst.awk
BEGIN { FS="[ :]" }
{ sum[$6,$2]+=$7; msgs[$6]; hrs[$2] }
END {
    for (msg in msgs) {
        print msg
        for (hr in hrs) {
            print hr, sum[msg,hr]+0
        }
        print ""
    }
}

$ awk -f tst.awk file
Message1
00 12
01 13

Message2
00 50
01 10

但显然它有点猜测,因为它与您发布的示例输入相对,但您没有提供相关的预期输出。

btw问题主题行AWK - Is it possible...,假设它是关于操纵文本的,那个问题的答案总是"是"所以不需要问是否可能。

我刚刚注意到您之前的问题,其中您说数据可能并不总是存在于您的数据中,因此这可能是您真正想要的:

$ cat tst.awk
BEGIN { FS="[ :]" }
{ sum[$6,$2+0]+=$7; msgs[$6] }
END {
    for (msg in msgs) {
        print msg
        #for (hr=0; hr<=23; hr++) {
        for (hr=0; hr<=4; hr++) {
            printf "%02d %d\n", hr, sum[msg,hr]
        }
        print ""
    }
}
$
$ awk -f tst.awk file
Message1
00 12
01 13
02 0
03 0
04 0

Message2
00 50
01 10
02 0
03 0
04 0

更改&#34; 4&#34;至&#34; 23&#34;明显。我还建议您考虑使用CSV输出,以便导入Excel等,例如:

$ cat tst.awk
BEGIN { FS="[ :]"; OFS="," }
{ sum[$6,$2+0]+=$7; msgs[$6] }
END {
    printf "hr"
    for (msg in msgs) {
        printf "%s%s", OFS, msg
    }
    print ""
    for (hr=0; hr<=4; hr++) {
        printf "%02d", hr
        for (msg in msgs) {
            printf "%s%d", OFS, sum[msg,hr]
        }
        print ""
    }
}

$ awk -f tst.awk file
hr,Message1,Message2
00,12,50
01,13,10
02,0,0
03,0,0
04,0,0

$ awk -f tst.awk file | column -s, -t
hr  Message1  Message2
00  12        50
01  13        10
02  0         0
03  0         0
04  0         0