【问题标题】:Count data from the logs从日志中计算数据
【发布时间】:2017-01-18 11:10:06
【问题描述】:

我有一个格式如下的日志文件:

 1: 2017-01-17 00:00:00,723 - [INFO] gid: 123456787  type: A
 2: 2017-01-17 00:00:00,727 - [INFO] gid: 123456787  Trans: 178
 3: 2017-01-17 00:00:00,729 - [INFO] gid: 123456788  type: B
 4: 2017-01-17 00:00:00,731 - [INFO] gid: 123456788  Trans: 121
 5: 2017-01-17 00:00:00,751 - [INFO] gid: 123456789  type: C
 6: 2017-01-17 00:00:00,771 - [INFO] gid: 123456790  type: D
 7: 2017-01-17 00:00:00,787 - [INFO] gid: 123456790  Trans: 121
 8: 2017-01-17 00:00:00,778 - [INFO] gid: 123456791  type: C
 9: 2017-01-17 00:00:00,789 - [INFO] gid: 123456791  Trans: 150

我的目标是按类型统计 Trans 组的总数。我的想法是每 02 行合并一次,然后用类型的关键字进行 grep。

$ cat logfile.txt |awk 'ORS=NR%2?FS:RS'|grep A 
2017-01-17 00:00:00,723 - [INFO] gid: 123456787  type: A 2017-01-17 00:00:00,727 - [INFO] gid: 123456787  Total: 178

$cat logfile.txt |awk 'ORS=NR%2?FS:RS'|grep C
2017-01-17 00:00:00,751 - [INFO] gid: 123456789  type: C 2017-01-17 00:00:00,771 - [INFO] gid: 123456790  type: D

预期输出:

$ cat logfile.txt |awk 'ORS=NR%2?FS:RS'|grep B|awk '{sum+=$16} END {print sum}
121

不幸的是,日志包含type 的行,而没有Trans 的下一行(第5 行)。

任何可以帮助我完成目标的想法。

【问题讨论】:

标签: awk grep pattern-matching


【解决方案1】:

没有必要做所有这些ORS 魔术:只需存储找到的最后一个 type 并创建一个数组来跟踪每个出现的值。

利用有用的数据作为行尾的最后一个单词,并用$NF提取:

awk '$NF ~ /^[0-9]+$/ {          # if last field is a digit
         data[type]+=$NF; next   # make the addition to this value
     }
     {type=$NF}                  # otherwise, pick the type value

     # finally, loop through the array and print the data
     END {for (i in data)        
          print i, data[i]}' file

使用您给定的文件:

$ awk '$NF ~ /^[0-9]+$/ {data[type]+=$NF; next} {type=$NF} END {for (i in data) print i, data[i]}' f
A 178
B 121
C 150
D 121

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2021-05-19
    相关资源
    最近更新 更多