需要使用 mpstat 获取平均空闲时间

需要使用 mpstat 获取平均空闲时间

我想使用 mpstat 获取服务器的平均空闲时间。我遇到的问题是 %idle 在所有版本的 Linux 中并不位于相同的列中。

例 1:

[root@testserver ~]# mpstat 1 2
Linux 2.6.32-358.el6.x86_64 (testserver)        06/18/2015      _x86_64_        (2 CPU)

12:41:17 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
12:41:18 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
12:41:19 AM  all    0.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00   99.00
Average:     all    0.25    0.00    0.25    0.00    0.00    0.00    0.00    0.00   99.50

例 2:

[root@testserver1 ~]# mpstat 1 2
Linux 2.6.18-308.8.2.el5 (testserver1)      06/17/2015

10:47:38 PM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
10:47:39 PM  all    0.12    0.00    0.00    0.00    0.00    0.00    0.00   99.88    191.09
10:47:40 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00    134.00
Average:     all    0.06    0.00    0.00    0.00    0.00    0.00    0.00   99.94    162.69

我尝试使用下面的命令作为通用解决方案,但由于少一列输出,因此平均值不合适。

mpstat 1 2 | egrep -v '^Linux|^$' |  awk -v c="%idle" 'NR==1 {for (i=1; i<=NF; i++) if ($i==c) break}''{print $i}'

我得到以下输出。

[root@testserver ~]# mpstat 1 2 | egrep -v '^Linux|^$' |  awk -v c="%idle" 'NR==1 {for (i=1; i<=NF; i++) if ($i==c) break}''{print $i}'
%idle
100.00
100.00

但期望的输出是

[root@testserver ~]# mpstat 1 2 | egrep -v '^Linux|^$' |  awk -v c="%idle" 'NR==1 {for (i=1; i<=NF; i++) if ($i==c) break}''{print $i}'
%idle
100.00
100.00
100.00

祝好,KJ

答案1

您可以使用:

awk '/%idle/ {for (i=1;i<=NF;i++) {if ($i=="%idle") col=i-1}}
     /^Average:/ {print $col}'

这会存储 所在的列,%idle并减去一,因为Average:没有 PM/AM 列。然后,当行以 开头时,它会打印该列Average:

测试

使用示例1:

$ awk '/%idle/ {for (i=1;i<=NF;i++) {if ($i=="%idle") col=i-1}} /^Average:/ {print $col}' a
99.50

使用示例2:

$ awk '/%idle/ {for (i=1;i<=NF;i++) {if ($i=="%idle") col=i-1}} /^Average:/ {print $col}' b
99.94

相关内容