Ответ 1
Моя uptime
выдает результат, который выглядит так:
$ uptime
12:49:10 up 25 days, 21:30, 28 users, load average: 0.50, 0.66, 0.52
Чтобы преобразовать это в ваш формат:
$ uptime | awk -F'( |,|:)+' '{print $6,$7",",$8,"hours,",$9,"minutes."}'
25 days, 21 hours, 34 minutes.
Как это устроено
-
-F'( |,|:)+'
awk делит свой ввод на поля. Это говорит awk использовать любую комбинацию одного или нескольких пробелов, запятых или двоеточий в качестве разделителя полей.
-
print $6,$7",",$8,"hours,",$9,"minutes."
Это заставляет awk печатать шестое поле и седьмое поле (разделенные пробелом), за которыми следуют запятая, 8-е поле, строковые
hours,
девятое поле и, наконец, строковыеminutes.
,
Работа с компьютерами с коротким временем безотказной работы с помощью sed
Начиная с перезагрузки, мое uptime
выдает:
03:14:20 up 1 min, 2 users, load average: 2.28, 1.29, 0.50
04:12:29 up 59 min, 5 users, load average: 0.06, 0.08, 0.48
05:14:09 up 2:01, 5 users, load average: 0.13, 0.10, 0.45
03:13:19 up 1 day, 0 min, 8 users, load average: 0.01, 0.04, 0.05
04:13:19 up 1 day, 1:00, 8 users, load average: 0.02, 0.05, 0.21
12:49:10 up 25 days, 21:30, 28 users, load average: 0.50, 0.66, 0.52
Следующая команда sed
обрабатывает эти форматы:
uptime | sed -E 's/^[^,]*up *//; s/, *[[:digit:]]* users.*//; s/min/minutes/; s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/'
С вышеупомянутыми временами это производит:
1 minutes
59 minutes
2 hours, 1 minutes
1 day, 0 minutes
1 day, 1 hours, 0 minutes
25 days, 21 hours, 30 minutes
Как это устроено
-
-E
включает расширенный синтаксис регулярного выражения. (На старых версиях GNU используйте-r
вместо-E
) -
s/^[^,]*up *//
Эта команда замены удаляет весь текст
up
. -
s/, *[[:digit:]]* users.*//
Эта команда замещения удаляет количество пользователей и весь текст, который следует за ним.
-
s/min/minutes/
Это заменяет
min
сminutes
. -
s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/'
Если строка содержит время в формате чч: мм, это отделяет часы от минут и заменяет их на
hh hours, mm minutes
.
Работа с компьютерами с коротким временем безотказной работы с помощью awk
uptime | awk -F'( |,|:)+' '{d=h=m=0; if ($7=="min") m=$6; else {if ($7~/^day/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes."}'
В тех же тестовых случаях, что и выше, это дает:
0 days, 0 hours, 1 minutes.
0 days, 0 hours, 59 minutes.
0 days, 2 hours, 1 minutes.
1 days, 0 hours, 0 minutes.
1 days, 1 hours, 0 minutes.
25 days, 21 hours, 30 minutes.
Для тех, кто предпочитает awk-код, разбитый на несколько строк:
uptime | awk -F'( |,|:)+' '{
d=h=m=0;
if ($7=="min")
m=$6;
else {
if ($7~/^day/) { d=$6; h=$8; m=$9}
else {h=$6;m=$7}
}
}
{
print d+0,"days,",h+0,"hours,",m+0,"minutes."
}'