2009-10-01 3 views
4

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

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

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

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

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

printf "%.0f\n" $avgload 

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

Спасибо и приветствую!

UPDATE:

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

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

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

`$ аптайм

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

Именно поэтому я принимаю 5-е поле.

+1

Обратите внимание, что проблема в том, что Printf не принимает входной параметр таким образом. Вам нужно будет использовать xargs или backticks, как указано в различных решениях ниже. –

+0

Нет, просто используйте 'awk' для форматирования. Он имеет 'printf'. –

+0

Таким образом, uptime | awk -F, '{printf"% 0.f \ n ", $ 5}'. –

ответ

9

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

uptime | awk '{printf "%.0f\n",$(NF-1)}' 
+0

+1 для использования 'awk' для форматирования, а не для передачи его вывода без необходимости другой команде. –

+0

Спасибо! (1) что означает $ (NF-1) для awk? (2) Пятое поле с запятыми - это 5-минутное время безотказной работы в моих системах. Посмотрите мое обновление на OP. Что вам нравится? – Tim

+0

NF-1 - количество полей - 1: http://tomecat.com/jeffy/tttt/awk.html –

1

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

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 
1

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

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

Упс ... 9 секунд слишком медленно. :) –

2

Простейшая версия (с использованием встроенного в AWK Printf - престижность Dennis Williamson):

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

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

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

Итак, что именно «xargs» купит вас здесь? Предположительно, выход 'uptime' является одной строкой. –

+0

xargs выводит выходные данные из awk в конец командной строки. Таким образом, вы получаете «printf»% 0.f \ n «0,75», если выход awk равен 0,75. –

+0

Попробуйте эту команду, например: echo "-ltr" | xargs ls –

1

Если у вас есть/Proc смонтированный вы можете использовать/Proc/loadavg:

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

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

awk '{printf "%.0f\n",$2}' /proc/loadavg