Отображение только времени безотказной работы [unix]

Я бы хотел сократить время безотказной работы

20:10  up 23 days,  3:28, 3 users, load averages: 3.84 1.06 0.64

так что он просто показывает:

23 days

Я пробовал использовать sed, но не уверен, что это подходящий инструмент для работы, и у меня нет большого опыта его использования.

Как я могу добиться желаемого результата?


person Rich Bradshaw    schedule 15.11.2009    source источник


Ответы (10)


Рассмотрите возможность использования cut.

  uptime | tr "," " " | cut -f6-8 -d" "

похоже, работает на моем MacBook. Здесь я также использовал tr, чтобы убить посторонний ",". Есть небольшая проблема с разными форматами для короткого и длительного времени безотказной работы.


Возможное решение sed:

uptime | sed 's/.*up \([^,]*\), .*/\1/'

который не полагается на строку «days», появляющуюся в выводе uptime.

person dmckee --- ex-moderator kitten    schedule 15.11.2009
comment
Разве я не проголосовал против ... оба кажутся логичными - может, они просто были в плохом настроении! - person Rich Bradshaw; 16.11.2009
comment
Движение за счет отрицательных голосов случается. Я просто хочу знать, не работает ли мое решение. - person dmckee --- ex-moderator kitten; 16.11.2009
comment
У меня не сработало в Arch Linux. Извините, я забыл прокомментировать после голосования против. - person icco; 16.11.2009
comment
@icco: Имея дополнительную информацию, я мог бы исправить это, но кровавые детали вывода стандартных утилит могут варьироваться от unix к unix, поэтому такие конвейеры иногда требуют настройки ... - person dmckee --- ex-moderator kitten; 17.11.2009

вы можете просто использовать оболочку без каких-либо внешних инструментов

$ var="20:10  up 23 days,  3:28, 3 users, load averages: 3.84 1.06 0.64"
$ var=${var/#*up}
$ echo ${var%%,*}
23 days
person ghostdog74    schedule 16.11.2009
comment
Это умно - не знал, что у тебя такое получится! - person Rich Bradshaw; 16.11.2009
comment
Отлично. Теоретически я знал, но никогда не вспоминал, что использовал расширения bash. (и, возможно, стоит отметить, что это не будет работать со всеми оболочками ...) - person dmckee --- ex-moderator kitten; 17.11.2009
comment
Исходная оболочка bourne, csh, не знаю о ksh ... все unix не запускают bash. - person dmckee --- ex-moderator kitten; 18.11.2009

В приведенных выше решениях отображаются только дни или часы. Я понимаю, что OP искал, но я также искал часы и минуты. Это отображает как дни, так и часы / минуты, когда система была включена более суток, или только часы, когда прошло менее одного дня:

uptime | sed 's/^.* up \+\(.\+\), \+[0-9] user.*$/\1/'

Реквизит черному поясному ниндзя по регулярным выражениям Заку В. за то, чтобы это работало.

person Scott    schedule 16.04.2013
comment
Для одного пользователя результат uptime - это 1 пользователь, поэтому он не соответствует пользователям (во множественном числе) в приведенном выше примере. Измените его на просто пользователя, и, похоже, он работает. - person Peter Gibson; 11.08.2014
comment
Чтобы соответствовать user или users, вы можете изменить конец регулярного выражения на ...users?.*$. Однако, поскольку .*$ соответствует всему до конца строки, просто опуская s, как предлагает @PeterGibson, дать ...user.*$ должно работать. - person AdrianHHH; 08.01.2015

Думаю, это простейшее решение:

uptime | awk '{print $3}'

время безотказной работы | awk '{print $ 3}'

10

person soulrider    schedule 02.12.2014

Это работает для меня:

$ uptime | grep -o "[0-9]* days"
70 days
person lenik    schedule 19.07.2018
comment
это должно быть выше - person cmcginty; 17.03.2020

uptime | cut -d',' -f 1 | cut -d 'p' -f 2-

Если с момента последней перезагрузки прошло n дней, будет выведено n дней. Он напечатает время в формате чч: мм, если время безотказной работы будет меньше суток.

$ uptime
12:20  up  1:36, 1 user, load averages: 2.75 2.63 2.26
$ uptime | cut -d',' -f 1 | cut -d 'p' -f 2-
  1:36
person ClearCrescendo    schedule 15.03.2016

Вышеуказанные ответы верны, но если кто-то из вас хотел использовать awk, используйте:

uptime | awk '{ print $3,$4 }'

Результат:

15 days,
person Nik    schedule 07.01.2018
comment
Если время безотказной работы меньше суток, будет выведено что-то вроде 5:04, 1, отражающее 5 часов 4 минуты и одного пользователя, вошедшего в систему. - person zaTricky; 19.07.2018

В выводе uptime обычно указано «x дней, y мин» или «x дней, y: z», но иногда, если время безотказной работы меньше дня, в первый раз указываются часы / минуты: основанный на выводе и не беспокоится о количестве дней. Остальная часть вывода очень согласована с точки зрения количества столбцов. В результате лично я использовал sed, чтобы просто удалить последние четыре столбца:

$ uptime | sed -e 's/^ [^ ]* up \(.*\)\(,[^,]*\)\{4\}$/\1/'
31 days, 35 min

В качестве альтернативы, если вам нужны только самые важные данные, вы можете использовать аналогичный метод, упомянутый другими, где вы просто получаете первый бит данных. Менее чем за сутки это приведет к <y> min или <y>:<z>. Если у вас будет больше суток, это приведет к <x> days.

$ uptime | sed -e 's/^ [^ ]* up \([^,]*\).*/\1/'
31 days

Наконец, если вы хотите отразить ноль, когда он составляет менее 24 часов, у вас также есть возможность использовать некоторые математические вычисления для /proc/uptime, используя bc или выражения оболочки:

$ uptime
 13:58:41 up 31 days, 55 min,  9 users,  load average: 0.80, 0.89, 0.81
$ echo $(( $(awk -F . '{print $1}' /proc/uptime) / 86400)) days
31 days

$ uptime
 13:59:01 up 21:18,  1 user,  load average: 0.00, 0.00, 0.00
$ echo $(( $(awk -F . '{print $1}' /proc/uptime) / 86400)) days
0 days
person zaTricky    schedule 19.07.2018

person    schedule
comment
\ 1 означает первую захваченную группу (в скобках). - person jtbandes; 15.11.2009
comment
Обратите внимание, что когда подстрока days отсутствует (когда перезагрузка произошла менее дня назад), это решение не сработает. - person Bart Kiers; 16.11.2009

person    schedule
comment
Это единственное решение, которое использует / proc / uptime для получения согласованного формата данных в первую очередь. - person BUFU; 17.03.2021