2009-11-15 7 views
2

Я хотел бы, чтобы обрезать выход из безотказной работыПоказаны только безотказной работы от времени безотказной работы [Unix]

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

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

23 days 

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

Как добиться результата, который я хочу?

ответ

11

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

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

, похоже, работает на моем MacBook. Здесь я также использовал tr, чтобы убить посторонние «,». Существует несколько проблем с различными форматами для коротких и длительных периодов времени.


Возможное решение СЕПГ:

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

, который не зависит от строки «дни», появляющихся на выходе uptime.

+0

Странная вниз голос ... Работает отлично, так что + 1. –

+0

Разве я не сбился с толку ... оба кажутся логичными - может быть, они были просто в плохом настроении! –

+0

Привод с помощью downvotes. Мне просто хотелось узнать, нарушено ли мое решение. – dmckee

5
uptime | sed -E 's/^.+([0-9]+ days).+$/\1/' 
+0

Awesome - that \ 1 было то, что я не мог сработать! –

+0

\ 1 означает первую захваченную группу (которая находится в круглых скобках). – jtbandes

+1

Обратите внимание, что, когда подстрока 'days' отсутствует (когда перезагрузка произошла меньше, чем день назад), это решение не будет работать. –

4

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

$ 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 
+0

Это умно - не знал, что вы можете это сделать! –

+0

Ницца. Я знал, теоретически, но я никогда не забываю использовать расширения bash. (и, возможно, стоит отметить, что это не будет работать со всеми оболочками ...) – dmckee

+0

@dmckee, с какими оболочками он не работает? – ghostdog74

3

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

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

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

+0

Это не работает, я получаю необработанные выходные данные. – CMCDragonkai

+1

Для одного пользователя вывод 'uptime' является« 1 пользователем », поэтому он не соответствует« пользователям »(множественное число) в приведенном выше. Измените его на «пользователя» и, похоже, он работает. –

+0

Чтобы соответствовать 'user' или' users', вы можете изменить конец регулярного выражения как '... users?. * $'. Однако, поскольку '. * $' Соответствует всем концам строки, просто опуская 's', как предлагает @PeterGibson, чтобы дать' ... user. * $ 'Должен работать. – AdrianHHH

2
uptime=$(</proc/uptime) ; uptime=${uptime%%.*} ; days=$((uptime/60/60/24)); echo $days days 
5

Я думаю, что это простое решение:

uptime | awk '{print $3}' 

Провел | AWK '{печати $ 3}'

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

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

$ 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 
0

Выше ответы правильны, но если кто из вас хотел использовать AWK затем использовать:

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

Результат:

15 days, 

 Смежные вопросы

  • Нет связанных вопросов^_^