【问题标题】:Assistance with awk/bash to capture memory difference协助 awk/bash 捕获内存差异
【发布时间】:2019-10-02 21:40:29
【问题描述】:

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

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

我想要一些关于如何将这些部分连接在一起的指导。不一定要寻找解决方案,而是围绕逻辑寻求帮助。

谢谢。

【问题讨论】:

  • 很好,您已经展示了您的尝试,您在代码标签中的预期输出,请在您的帖子中的代码标签中发布示例输入,然后让我们知道。
  • 嗨@RavinderSingh13,帖子已更新。

标签: bash awk


【解决方案1】:

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}'

【讨论】:

  • 您的响应时间令人印象深刻!而且您的脚本运行良好。让我进一步研究逻辑,谢谢。
【解决方案2】:

请您尝试关注(我现在在移动设备上无法测试它,应该可以但是)

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

【讨论】:

  • @user,你能不能试试这个解决方案,然后让我知道。
  • 嗨@RavinderSingh13,感谢您的解决方案。差异和时间差是正确的,但是除了打印 mibd_interface 行之外,还打印了其他行 (ospf)。 Total diff=-222352 Total mallocs=1000605
  • @user,好的,现在编辑了我的解决方案,请检查并通知我。
  • 您的命令不显示 ---(虚线),但除此之外在功能上是合理的。
  • @user,好的,现在解决了,请检查并告诉我好吗?
猜你喜欢
  • 2020-02-11
  • 2018-05-12
  • 1970-01-01
  • 2015-12-08
  • 2015-06-03
  • 2013-02-12
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
相关资源
最近更新 更多