Awk, Sed: как анализировать и суммировать значения из строки - PullRequest
3 голосов
/ 17 февраля 2010

У меня есть строка, подобная этой

Cpu(s):  1.9%us,  2.1%sy,  1.5%ni, 94.5%id,  0.8%wa,  0.0%hi,  0.1%si,  0.0%st

, она представляет использование ЦП моего Unix-бокса.
Теперь мне нужно применить awk и sed (я думаю), чтобы извлечь текущую загрузкумои процессоры.Я хотел бы извлечь значения 'us', 'sy', 'ni' из строки, а затем я хочу их суммировать.
Скрипт должен вернуть 5,5 (1,9 + 2,1 + 1,5) ... Вы знаете, как этого добиться?
Большое спасибо

Ответы [ 3 ]

6 голосов
/ 17 февраля 2010

ну, вам просто нужна одна команда awk. Нет необходимости в других инструментах

$ str="Cpu(s):  1.9%us,  2.1%sy,  1.5%ni, 94.5%id,  0.8%wa,  0.0%hi,  0.1%si,  0.0%st" 
$ echo $str | awk '{print $2+$3+$4+0}'
5.5
1 голос
/ 17 февраля 2010

Конвейер с awk, sed и bc сделает хитрость:

echo 'Cpu(s): 1.9%us, 2.1%sy, 1.5%ni, 94.5%id, 0.8%wa, 0.0%hi, 0.1%si, 0.0%st'
    | awk '{print $2"+"$3"+"$4}'
    | sed 's/%..,//g'
    | bc

даст:

5.5

, как и ожидалось.

awk вытянет три поля и напечатает их с + между ними:

1.9%us,+2.1%sy,+1.5%ni,

sed удалит все последовательности %..,, где .. - любые два символа(us, sy и ni в данном конкретном случае):

1.9+2.1+1.5

bc оценит это и даст вам ответ:

5.5
0 голосов
/ 16 марта 2010
cpu='Cpu(s):  1.9%us,  2.1%sy,  1.5%ni, 94.5%id,  0.8%wa,  0.0%hi,  0.1%si,  0.0%st'
echo $cpu|sed 's/^Cpu.*: //;s/%..,*//g'|cut -f1-3 -d" "|tr " " "+"|bc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...