bash - 协助 awk/bash 捕获内存差异
问题描述
我正在尝试从以下文件中提取以下输出:
xr_lab# show clock
Thu Sep 19 14:38:02.812 WIB
14:38:02.893 WIB Thu Sep 19 2019
xr_lab#
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
-------------------------------------------------------------------------------
6777 ospf 24292985 24293753 768 272634
7582 mibd_interface 8670334 8484152 -186182 267657
xr_lab#show clock
Thu Sep 19 14:42:42.425 WIB
14:42:42.497 WIB Thu Sep 19 2019
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
期望的输出
PID NAME MEM BEFORE MEM AFTER DIFFERENCE MALLOCS-NEW
-------------------------------------------------------------------------------
7582 mibd_interface 8670334 8484152 -186182 267657
7582 mibd_interface 8369050 8514825 145775 126259
7582 mibd_interface 8446906 8264885 -182021 322280
7582 mibd_interface 8264884 8264960 76 284409
-------------------------------------------------------------------------------
-222352 <time difference>
这是我到目前为止所拥有的。
$ awk '/PID/{print;getline;print;exit} /mibd_interface/' snmpoutput.txt
PID NAME MEM BEFORE MEM AFTER DIFFERENCE MALLOCS-NEW
-------------------------------------------------------------------------------
7582 mibd_interface 8670334 8484152 -186182 267657
PID NAME MEM BEFORE MEM AFTER DIFFERENCE MALLOCS-NEW
-------------------------------------------------------------------------------
7582 mibd_interface 8369050 8514825 145775 126259
PID NAME MEM BEFORE MEM AFTER DIFFERENCE MALLOCS-NEW
-------------------------------------------------------------------------------
7582 mibd_interface 8446906 8264885 -182021 322280
PID NAME MEM BEFORE MEM AFTER DIFFERENCE MALLOCS-NEW
-------------------------------------------------------------------------------
7582 mibd_interface 8264884 8264960 76 284409
$ awk '/show clock/{getline;print}' snmpoutput.txt
Thu Sep 19 14:38:02.812 WIB <<<< capture this line
Thu Sep 19 14:42:42.425 WIB
Thu Sep 19 14:46:15.895 WIB
Thu Sep 19 14:50:44.213 WIB <<<< capture this line
$ awk '/mibd_interface/{x+=$5} END {print x}' snmpoutput.txt
-222352
我想要一些关于如何将这些部分连接在一起的指导。不一定要寻找解决方案,而是围绕逻辑寻求帮助。
谢谢。
解决方案
awk
是一门很棒的语言:
awk '
/PID/{
# store the line with PID NAME BLA BLA
pidline=$0;
# alse remember the line with ----------------------- minuses
getline;
minusline=$0
}
/mibd_interface/{
# remember the line with mibd_interface
mibdlines[mibdlen++]=$0;
# calculate some-things
diff += $5;
timediff += $6
}
# finally output!
END{
# output the PID NAME ...
print pidline;
# output ------------
print minusline;
# output the mibd_interface lines
for (i in mibdlines) print mibdlines[i];
# another ------------ line
print minusline;
# and output the difference, printf is there for a simple formatting
printf "%56s%-12d%-d\n"," ",diff,timediff
}'
或单线:
awk '/PID/{pidline=$0;getline;minusline=$0} /mibd_interface/{mibdlines[mibdlen++]=$0; diff += $5; timediff += $6} END{ print pidline; print minusline; for (i in mibdlines) print mibdlines[i]; print minusline; printf "%56s%-12d%-d\n"," ",diff,timediff}'
当输入输入输出时:
PID NAME MEM BEFORE MEM AFTER DIFFERENCE MALLOCS-NEW
-------------------------------------------------------------------------------
7582 mibd_interface 8670334 8484152 -186182 267657
7582 mibd_interface 8369050 8514825 145775 126259
7582 mibd_interface 8446906 8264885 -182021 322280
7582 mibd_interface 8264884 8264960 76 284409
-------------------------------------------------------------------------------
-222352 1000605
在第二次尝试中,不需要使用 mbd_interface 存储这些行,因此我们可以在它们出现时输出它们:
awk '
/PID/{
if(once == 0) {
#output the PID NAME line
print;
# output and remember the -------------- line
getline;
minusline=$0;
print;
}
once=1
}
/mibd_interface/{
# output the mibd line
print;
# calculate some-things
diff += $5; timediff += $6
}
END{
# print another minus line
print minusline;
# print the calculated some-things
printf "%56s%-12d%-d\n"," ",diff,timediff
}'
输出相同。或单线:
awk '/PID/{if(once == 0) { print; getline; minusline=$0; print; } once=1 } /mibd_interface/{print; diff += $5; timediff += $6} END{ print minusline; printf "%56s%-12d%-d\n"," ",diff,timediff}'
推荐阅读
- r - 如何捕获警告并仍然运行表达式
- asp.net-core-2.1 - ASP.NET Core Web API (2.1.4) 项目导致 HTTP 502.5 错误,错误代码为 0x80070005
- c++ - Qt 婚介服务器
- node.js - 可以监控节点 API 调用的响应吗?
- c# - 具有引用对象容器的只读属性的对象的 Newtonsoft json 反序列化
- r - 将自定义多元回归的输出从 R 导出到 Latex
- java - 当我从 CDI 支持 bean 调用 EJB Dao 时,返回的实体中的 @OneToMany 集合被清除并为空
- azure-powershell - 获取 VM 名称和 FQDN
- markdown - 注释掉表格行
- tensorflow - 如何将 hdf5 转换为 tensorflow 检查点