【发布时间】:2020-02-11 02:24:33
【问题描述】:
我有一个文件,其中包含重复块中的以下信息。
第一次迭代
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
问题:
- 我怎样才能实现上述所需的输出?
- 如何将日期格式化为 dd-mm hh:mm:ss 格式?最终,我想将数据输入 gnuplot 以在上面绘制所需的输出,x 轴为时间,y 轴为内存。
参考问题: Assistance with awk/bash to capture memory difference
谢谢。
【问题讨论】:
-
更改
print start,end,$i->print start,$i; print end,$i?dd-mm hh:mm:ssawk 具有 mktime 功能,但它需要 完全YYYY MM DD HH MM SS [DST]格式,在您的情况下Sep很难做到。所以首先用 ex 提取带有数字的日期。,使用 awk 作为分隔符,然后为每一行将日期馈送到 GNUdate并将其转换为所需格式的时间戳。如果您想要将日期转换为您的格式的性能,有strptime from dateutils -
@user,您能否检查一下我的解决方案,如果对您有帮助,请告诉我?