协助 awk/bash 捕获内存差异

  • 本文关键字:内存 awk bash 协助 bash awk
  • 更新时间 :
  • 英文 :


我正在尝试从以下文件中提取以下输出:

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%-dn"," ",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%-dn"," ",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%-dn"," ",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%-dn"," ",diff,timediff}'

您能否尝试以下操作(我现在在移动设备上,无法测试它,应该可以工作,但是(

awk '/^PID/{found=1;if(++count==1){print};next} /^-/ && found{print;next} /^[0-9]/ && found && /mibd_interface/; /mibd_interface/{diff+=$5;mallocs+=$6} END{print "Total diff=" diff ORS "Total mallocs=" mallocs}' Input_file

最新更新