Ваша проблема в том, что извлеченное поле использует запятую в качестве десятичного разделителя, а awk ожидает, что числа с плавающей запятой будут использовать точку.
Это воспроизводит вашу проблему:
$ LC_ALL=de_DE top -bn 1 | awk 'NR==1'
top - 08:37:07 up 1 day, 10:22, 5 users, load average: 0,17, 0,24, 0,26
Как видите, в числах используется запятая в качестве десятичного разделителя. Вам нужно что-то похожее на:
$ LC_ALL=en_US top -bn 1 | awk 'NR==1'
top - 08:38:28 up 1 day, 10:23, 5 users, load average: 0.56, 0.34, 0.30
Но это будет зависеть от того, какие локали были установлены (проверьте с помощьюlocale -a
)в вашей системе. Всегда доступна локаль C
.
$ LC_ALL=C top -bn 1 | awk 'NR==1'
top - 08:40:35 up 1 day, 10:25, 5 users, load average: 0.50, 0.39, 0.31
Но использовать top только для извлечения первой строки — это излишество.Лучше использовать время безотказной работы:
$ LC_ALL=C uptime
08:42:08 up 1 day, 10:27, 5 users, load average: 0.35, 0.37, 0.31
А еще лучше прочтите файл /proc/loadavg
$ cat /proc/loadavg
0.29 0.34 0.30 1/468 15084
На что, кстати, не влияет локаль. Первое число — это средняя нагрузка за 1 минуту, просто выберите его и распечатайте в любом формате:
$ awk '{printf( "%s\n %f\n %d\n", $1, $1, $1 )}' /proc/loadavg
0.35
0.350000
0
Для использования средней нагрузки 1, 5 и 15 минут:
$ awk '{printf( "%7.3f %7.3f %5.2f\n", $1, $2, $3 )}' /proc/loadavg
0.150 0.340 0.33