【问题标题】:Getting iowait with top and awk使用 top 和 awk 获取 iowait
【发布时间】:2014-03-22 21:16:44
【问题描述】:

对于一个基准脚本,我需要在一些操作后立即提取 iowait %。

目前,我发现最好的方法是: IOWAIT=top -bn2 | awk '$1~/Cpu/ {print $6}' | sed -n '2p' | tr -d '%wa,'

正确的输出类似于 2.1:

首先,如果我没有精确“-bn2”,我不知道为什么,如果我只捕获 1 次,它总是 0.1%。所以我捕获了两次,然后我 awk 获取 iowait 字段,然后我 sed 第二行,然后我删除了“%wa”

仅供参考,这是top -bn2 | grep Cpu的输出

Cpu(s):  2.8%us,  0.4%sy,  0.0%ni, 96.6%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st<br>
Cpu(s):  0.2%us,  2.9%sy,  0.0%ni, 87.1%id,  9.5%wa,  0.0%hi,  0.3%si,  0.0%st

我的问题如下: 当我得到一列 100.0%(例如空闲)时,它会移动列号,所以我的 awk 不再工作,我得到“0.0%hi”字段。

我的问题如下:

-如何告诉 awk 使用 "%wa" 进入列?

如果有人对我想做的事情有最好的方法,我当然愿意接受建议!

谢谢

【问题讨论】:

    标签: regex bash awk disk-io iowait


    【解决方案1】:

    2 种方法。你没有说,但我认为你在 linux 上(顶级语法在 osx 上不起作用),所以这应该适用于 iostat:

    iostat -c|awk '/^ /{print $4}'
    

    或与顶部:

    top -bn2| awk -F"," '/Cpu/{if(p==0){p=1}else{split($5,a,"%");print a[1]}}'
    

    【讨论】:

      【解决方案2】:

      单独使用 grep 怎么样:

      top -bn2 | grep -o -E "[[:digit:]]*.[[:digit:]]%wa" | tr -d '%wa'
      

      【讨论】:

      • 我接受了 bazzargh 的回答是否与我原来的问题更相关。但是,我将继续您的解决方案(添加 sed 以选择第二行),因为这是我完全理解的解决方案!再次感谢你们俩(抱歉,我无法为您的答案投票)
      【解决方案3】:

      一体机

      top -bn2 | awk '$1~/Cpu/&&NR==2{for (i=1;i<=NF;i++)if ($i~/%wa/) {sub(/%wa,/,X,$i);print $i}}' 
      

      【讨论】:

      • 您好,也感谢您的帮助!当我尝试你的建议时,我没有得到任何结果,而且由于我不是 awk 常客也不是 bash,我绝对无法调试它:(
      猜你喜欢
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2022-01-20
      • 2021-09-29
      • 2019-08-01
      • 2015-12-09
      • 1970-01-01
      • 2020-09-19
      相关资源
      最近更新 更多