Получение iowait с помощью top и 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»?

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

Спасибо


person Brice    schedule 21.02.2014    source источник


Ответы (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]}}'
person bazzargh    schedule 21.02.2014

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

top -bn2 | grep -o -E "[[:digit:]]*.[[:digit:]]%wa" | tr -d '%wa'
person Timmah    schedule 21.02.2014
comment
Я принял ответ баззарга, если он более актуален для моего первоначального вопроса. Тем не менее, я воспользуюсь вашим решением (с добавлением sed для выбора второй строки), так как это то, что я полностью понимаю! Еще раз спасибо вам обоим (и извините, я не могу проголосовать за ваш ответ) - person Brice; 21.02.2014

Все в одном

top -bn2 | awk '$1~/Cpu/&&NR==2{for (i=1;i<=NF;i++)if ($i~/%wa/) {sub(/%wa,/,X,$i);print $i}}' 
person BMW    schedule 21.02.2014
comment
Привет, спасибо за вашу помощь тоже! Я не получил никакого результата, когда попробовал ваше предложение, и, поскольку я не регулярный awk и не bash, я абсолютно не могу его отлаживать :( - person Brice; 21.02.2014