逐块处理日志,每个块包含多行

时间:2019-07-11 14:17:37

标签: linux bash awk

我尝试在执行一些后台作业时收集所有系统统计数据。例如,我使用以下命令来收集IO统计信息:

iostat -xty 5

此脚本用于每5秒收集I / O统计信息。因此,我的日志将包含许多数据块。这是我得到2个块的示例日志:

Linux 3.10.0-957.21.3.el7.x86_64 (dp-sim-rockdb-1)      07/09/19        _x86_64_        (8 CPU)

07/09/19 17:37:21
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          75.97    0.00   21.65    0.00    0.00    2.38

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00    1.00     0.00     4.00     8.00     0.00    1.00    0.00    1.00   1.00   0.10
sdb               0.00     7.00   27.00   39.00   108.00  7676.00   235.88     0.47    7.14    2.07   10.64   0.56   3.70

Linux 3.10.0-957.21.3.el7.x86_64 (dp-sim-rockdb-1)      07/09/19        _x86_64_        (8 CPU)

07/09/19 17:37:26
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          73.78    0.00   23.97    0.12    0.00    2.12

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   11.00    1.00   328.00     4.00    55.33     0.56   50.17   54.64    1.00   8.67  10.40
sdb               0.00    10.00    0.00   42.00     0.00  9920.00   472.38     0.34    8.05    0.00    8.05   0.33   1.40

我经常使用awk解析日志并再次进行重新格式化然后再绘制它们。对于每个块,我想获取DateTime字符串和字段wkB / s,然后合并为一行:

07/09/19 17:37:21,7676.00
07/09/19 17:37:26,9920.00
...

当我使用awk时,困难的事情是:awk命令处理日志的每一行。但是在我的示例中,我需要识别一个障碍。然后在此块中,我需要将多行中的一些数据合并到1行中。

请告诉我一个想法。

1 个答案:

答案 0 :(得分:1)

查找每个块中唯一的字符串。
在示例中给出的输出下,以下内容应该起作用:

resolve()