Нужно получить среднее время простоя с помощью 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:
,
Тестовое задание
С sample1:
$ awk '/%idle/ {for (i=1;i<=NF;i++) {if ($i=="%idle") col=i-1}} /^Average:/ {print $col}' a
99.50
С sample2:
$ awk '/%idle/ {for (i=1;i<=NF;i++) {if ($i=="%idle") col=i-1}} /^Average:/ {print $col}' b
99.94