首页 > 解决方案 > 协助 awk/bash 绘制内存差异

问题描述

我有一个文件,其中包含重复块中的以下信息。

第一次迭代

xr_lab#show memory compare start
Thu Sep 19 14:38:06.400 WIB   <<<<<<<<<< START TIME
Successfully stored memory snapshot in /var/log/malloc_dump_memcmp_start.out
xr_lab#
xr_lab#
xr_lab#show memory compare end
Thu Sep 19 14:40:56.123 WIB   <<<<<<<<<< END TIME
Successfully stored memory snapshot in /var/log/malloc_dump_memcmp_end.out
xr_lab#
xr_lab#show memory compare report
Thu Sep 19 14:41:08.084 WIB

PID    NAME                     MEM BEFORE    MEM AFTER  DIFFERENCE MALLOCS-NEW
-------------------------------------------------------------------------------

2550   sysdb_svr_local          7881443     7878256     -3187       87391
7582   mibd_interface           8670334     8484152     -186182     267657

第二次迭代

xr_lab#show memory compare start
Thu Sep 19 14:43:07.946 WIB   <<<<<<<<<< START TIME
Successfully stored memory snapshot in /var/log/malloc_dump_memcmp_start.out
xr_lab#
xr_lab#
xr_lab#
xr_lab#show memory compare end
Thu Sep 19 14:45:27.916 WIB   <<<<<<<<<< END TIME
Successfully stored memory snapshot in /var/log/malloc_dump_memcmp_end.out
xr_lab#
xr_lab#
xr_lab#show memory compare report
Thu Sep 19 14:45:42.091 WIB

PID    NAME                     MEM BEFORE    MEM AFTER  DIFFERENCE MALLOCS-NEW
-------------------------------------------------------------------------------
6777   ospf                     24294569    24283592    -10977      227389
7582   mibd_interface           8369050     8514825     145775      126259

我想在一列中捕获 {start time, mem_before},在 mibd_interface 的另一列中捕获 {end time, mem_after}。

初步尝试:

awk '/show memory compare start/{
             getline; start=$0;
  }
     /show memory compare end/{
             getline; end=$0;
  }

     /mibd_interface/ {for(i=3; i<5; i++){print start,$i,end,$i}}' file.txt

输出

Thu Sep 19 14:38:06.400 WIB 8670334
Thu Sep 19 14:40:56.123 WIB 8670334
Thu Sep 19 14:38:06.400 WIB 8484152
Thu Sep 19 14:40:56.123 WIB 8484152

期望的输出

Thu Sep 19 14:38:06.400 WIB 8670334
Thu Sep 19 14:40:56.123 WIB 8484152

问题:

  1. 我怎样才能达到上面想要的输出?
  2. 如何将日期格式化为 dd-mm hh:mm:ss 格式?最终,我想将数据输入 gnuplot 以在上面绘制所需的输出,x 轴为时间,y 轴为内存。

参考问题: 协助 awk/bash 捕捉内存差异

谢谢。

标签: bashawk

解决方案


我认为你在印刷阶段工作太努力了。这不就是你想要的吗?

/mibd_interface/ {
    print start, $3, "\n" end, $4
}

以这种方式修改,我得到:

$ ./report.awk data
Thu Sep 19 14:38:06.400 WIB 8670334 
Thu Sep 19 14:40:56.123 WIB 8484152

请注意,因为换行字符串后面没有逗号,所以它被连接到end,这是您想要的,否则在第二行的开头引入一个空格作为字段分隔符。

当然,您也可以使用两个print语句。


推荐阅读