Получение Айоваит с топ и awk

Для сценария тестирования мне нужно извлечь iowait % сразу после небольшой операции.

На данный момент лучший способ, который я нашел, был следующим: IOWAIT=top -bn2 | awk '$1~/Cpu/ {print $6}' | sed -n '2p' | tr -d '%wa,'

Правильный вывод что-то вроде 2.1:

Во-первых, если я не указал "-bn2", я не знаю почему, это всегда 0,1%, если я беру захват только 1 раз. Таким образом, я делаю снимок два раза, затем получаю awk, чтобы получить поле iowait, затем записываю вторую строку и затем удаляю "%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"?

Если у кого-то есть лучший подход к тому, что я хочу сделать, я, конечно, очень открыт для предложений!

Спасибо

3 ответа

Решение

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

Как насчет одного только grep:

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

Все в одном

top -bn2 | awk '$1~/Cpu/&&NR==2{for (i=1;i<=NF;i++)if ($i~/%wa/) {sub(/%wa,/,X,$i);print $i}}' 
Другие вопросы по тегам