awk и printf в bash - PullRequest
       20

awk и printf в bash

4 голосов
/ 01 октября 2009

Я пытаюсь получить округленное число средней нагрузки за последние 5 минут. Итак, вот моя команда:

 uptime | awk -F, '{print $5}'|printf "%.0f\n"

Это кажется неправильным, поскольку всегда дает мне 0.

Если я попытался использовать переменную в качестве промежуточного между awk и printf, то это правильно

 avgload=$(uptime | awk -F, '{print $5}')

 printf "%.0f\n" $avgload

Так что, не так с моей первой попыткой?

Спасибо и всего наилучшего!

UPDATE:

Просто для получения средней нагрузки за последние 5 минут, вот вывод времени безотказной работы на моем сервере Linux (Kubuntu)

$ uptime<br> 13:52:19 up 29 days, 18 min, 15 users, load average: 10.02, 10.04, 9.58

На моем ноутбуке (Ubuntu) он похож

`$ uptime

13: 53: 58 до 3 дней, 12:02, 8 пользователей, средняя загрузка: 0,29, 0,48, 0,60 `

Вот почему я беру 5-е поле.

Ответы [ 5 ]

9 голосов
/ 01 октября 2009

Пятое поле, разделенное запятыми, из вывода времени доступности не существует (по крайней мере, в моей системе), поэтому вы продолжаете получать ноль. 5-минутное время безотказной работы является вторым по последнему полю, поэтому это работает:

uptime | awk '{printf "%.0f\n",$(NF-1)}'  
3 голосов
/ 01 октября 2009

Простейшая версия (используйте встроенный awk printf - слава Деннис Уильямсон ):

uptime |awk -F, '{printf "%0.f\n",$5}'

Оригинальный ответ: вместо этого запустите xargs.

uptime |awk -F, '{print $5}' |xargs printf "%0.f\n"
1 голос
/ 02 октября 2009

Если у вас есть / proc, вы можете использовать / proc / loadavg:

LANG=C
read _ uptime _ </proc/loadavg
printf "%.0f\n" $uptime

Приведенный выше код использует только встроенные команды оболочки. Тем не мение, если вам нравится, вы также можете использовать awk:

 awk '{printf "%.0f\n",$2}' /proc/loadavg
1 голос
/ 01 октября 2009

Я не думаю, что вы можете передать ввод printf на стандартный вывод. Попробуйте эту версию:

printf "%.0f\n" `uptime | awk -F, '{print $5}'`
1 голос
/ 01 октября 2009

Вы можете просто сделать

printf "%.0f\n" `uptime | awk -F, '{print $5}'`

Обратные пометки, по сути, являются подстановкой команд, поэтому, чем бы ни был вывод uptime | awk -F, '{print $5}', будет аргумент printf.

Проблема с первым подходом заключается в том, что printf просто не принимает аргументы из stdin; если бы он принял аргументы от stdin, то он бы работал нормально. Кроме того, отсутствие аргументов для printf, по-видимому, означает «поставить ноль для моих аргументов».

$ echo hello | printf "%s"

$ printf "%s" hello
hello
$ printf "%.0f"
0
...