AWK - 组织/排序多维数组3.1.7

时间:2016-06-23 13:19:47

标签: awk gawk

我的问题

  

我需要查看日志文件中的所有行(请参阅下面的输入)   找出如何组织工作时间($3)00 - 23(并非总是如此)   所有的时间)不使用增量的变量,只打印一个   每小时一行。

输入文件样本

...
INFO  2016-06-15 00:00:30.065 TelegramDispatcher                                       - --> Complete telegram dispatching took 8.9ms (canHandle(56:TelegramHandlerECHLane) took 0.0ms, handleTelegram took 2.2ms, commit took 5.6ms, doACK took 0.6ms, doNAK took -0.0ms performAfterCommit took 0.3ms, failedCanHandle took 0.1ms)
INFO  2016-06-15 00:00:30.072 TelegramDispatcher                                       - --> Complete telegram dispatching took 7.2ms (canHandle(56:TelegramHandlerECHLane) took 0.0ms, handleTelegram took 2.0ms, commit took 4.1ms, doACK took 0.7ms, doNAK took -0.0ms performAfterCommit took 0.3ms, failedCanHandle took 0.1ms)
INFO  2016-06-15 00:00:30.114 TelegramDispatcher                                       - --> Complete telegram dispatching took 12.4ms (canHandle(69:TelegramHandlerTUNotification) took 0.0ms, handleTelegram took 4.3ms, commit took 6.6ms, doACK took 1.0ms, doNAK took -0.0ms performAfterCommit took 0.3ms, failedCanHandle took 0.2ms)
INFO  2016-06-15 00:00:30.165 TelegramDispatcher                                       - --> Complete telegram dispatching took 19.6ms (canHandle(69:TelegramHandlerTUNotification) took 0.0ms, handleTelegram took 3.6ms, commit took 14.3ms, doACK took 0.9ms, doNAK took -0.0ms performAfterCommit took 0.5ms, failedCanHandle took 0.1ms)
INFO  2016-06-15 00:00:30.271 TelegramDispatcher                                       - --> Complete telegram dispatching took 10.0ms (canHandle(69:TelegramHandlerTUNotification) took 0.0ms, handleTelegram took 3.7ms, commit took 4.8ms, doACK took 0.9ms, doNAK took -0.0ms performAfterCommit took 0.3ms, failedCanHandle took 0.1ms)
INFO  2016-06-15 00:00:30.300 TelegramDispatcher                                       - --> Complete telegram dispatching took 18.7ms (canHandle(61:TelegramHandlerPackingOrderBufferHanging) took 0.0ms, handleTelegram took 7.3ms, commit took 10.2ms, doACK took 0.8ms, doNAK took -0.0ms performAfterCommit took 0.3ms, failedCanHandle took 0.1ms)
...

当前代码

#!/usr/bin/gawk -f

BEGIN {
        print "-------------------------------------------------------"
        print "----------Telegram Processing Time by Hour-------------"
        print "-------------------------------------------------------"
} #End of BEGIN
{ #Start of MID
        key = substr($12,match($12,":")+1,match($12,")")-15); #Message Extracted 10 Total
        key2 = substr($3,1,2) #Hour
        MSG_TYPE[key]++ #Distinct Message
        MSG_HR[key,key2] += $11 #Tots up Time Took for each MSG by Hour
} #End of MID
END {
                for (msg in MSG_TYPE) {
                        print msg
                        print "-----------------------------------"
                        for(msghr in MSG_HR) {
                        split(msghr,indices,SUBSEP);
                        hr = indices[2];
                        print msg #Added this to try and Debug
                        print hr
                        print "AVG by Hour: "MSG_HR[msghr]"ms"
                        }
                print "\n"
                        }
} #End of END

为了解释一下这段代码,MSG_HR数组正在加起来$11,在第一个***ms took之后引用key }正在返回msgkey2正在返回小时。

当前输出样本

...
TelegramHandlerECHLane
-----------------------------------
TelegramHandlerECHLane
14
AVG by Hour: 80950.6ms
TelegramHandlerECHLane
08
AVG by Hour: 25.2ms
TelegramHandlerECHLane
01
AVG by Hour: 75053.9ms
...
TelegramHandlerLaneStatusHangingMPA
-----------------------------------
TelegramHandlerLaneStatusHangingMPA
14
AVG by Hour: 80950.6ms
TelegramHandlerLaneStatusHangingMPA
08
AVG by Hour: 25.2ms
TelegramHandlerLaneStatusHangingMPA
01
AVG by Hour: 75053.9ms
...

所需的输出样本

...
TelegramHandlerECHLane
-----------------------------------
00
AVG by Hour: 
01
AVG by Hour:
02
AVG by Hour:
03
AVG by Hour:
04
AVG by Hour:
05
AVG by Hour:
06
AVG by Hour:
...

我尝试以上述格式列出10种不同的MSG_TYPES。我无法升级到awk V 4.1.0,因为我知道这会让事情变得更容易。 (真正的多维数组等。)

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

1 个答案:

答案 0 :(得分:1)

您的代码中似乎有错误。摘自你的代码(我修复了缩进):

        for (msg in MSG_TYPE) {
            print msg
            print "-----------------------------------"
            for(msghr in MSG_HR) {
                split(msghr,indices,SUBSEP);
                msg = indices[1];

此外,您的外部循环是通过消息。在内循环中,您处理MSG_HR的所有成员,而不是仅处理具有特定消息的成员。这看起来很奇怪。 你的外循环有msg作为循环变量。但是,在内循环中,您更改msgmsg = indices[1];)。在循环中更改循环变量可能是一个错误。