Анализ `uptime` только для продолжительности

Анализ `uptime` только для продолжительности

Когда я запускаю команду «uptime» на своем Mac, я получаю следующий вывод:

19:52  up 14 mins, 2 users, load averages: 2.95 4.19 4.31

Это немного меняется в зависимости от того, как долго система находится в рабочем состоянии, добавляя часы, а затем дни. Таким образом, я хотел бы удалить первое слово плюс пробел и 4 символа перед "пользователями".

Изготовление19:52 up 14 mins, 2 users, load averages: 2.95 4.19 4.31

этот:

up 14 min

Или

8:03 up 52 days, 20:47, 3 users, load averages: 1.36 1.42 1.40

этот:

up 52 days, 20:47

Или:

22:19 up 54 days, 1 min, 4 users, load averages: 2.08 2.06 2.27

этот:

up 54 days, 1 min

Пока что самое большее, что я могу сделать, это использовать это: uptime | cut -d " " -f2- | sed 's/users.*//'но это все еще дает мне пробел перед "up" и мне все еще нужно удалить 4 символа в конце строки. Может кто-нибудь просветить меня?

решение1

Я использую это (при необходимости адаптирую, включив единицы измерения):

#!/usr/bin/awk -f

    BEGIN {
      while ("uptime" | getline)
        gsub(/,/,"")
        if (NF==10)
          print $3
        else if (NF==11)
          print $3,$4
        else if (NF==12)
          print $3,$4,$5
        else
          print $3,$4,$5,$6
      close("uptime")
    }

решение2

Пытаться:

sed -E 's/.*(up.*), [[:digit:]]+ user.*/\1/'

Примеры

Вот примеры из вопроса:

$ cat upfile
19:52  up 14 mins, 2 users, load averages: 2.95 4.19 4.31
8:03 up 52 days, 20:47, 3 users, load averages: 1.36 1.42 1.40
22:19 up 54 days, 1 min, 4 users, load averages: 2.08 2.06 2.27

Команда sed выдает:

$ sed -E 's/.*(up.*), [[:digit:]]+ user.*/\1/' <upfile
up 14 mins
up 52 days, 20:47
up 54 days, 1 min

Как это работает

Мы используем одну заменяющую команду:

s/.*(up.*), [[:digit:]]+ user.*/\1/
  • Первые .*совпадения с начала строки.

  • (up.*)сопоставляет слово и следующий за ним текст и сохраняет его в группе 1.

  • , [[:digit:]]+ usersсоответствует запятой, за которой следует пробел, за которой следует одна или несколько цифр, за которым следует пробел, за которым следует строка users.

  • Второе .*соответствует всему после user.

Заменяем все это группой 1, обозначенной \1.

Совместимость

Это выше должно работать как на BSD/OSX, так и на современном Linux. На очень старом Linux, возможно, придется заменить -Eна -r:

sed -r 's/.*(up.*), [[:digit:]]+ user.*/\1/'

Perl-версия

$ perl -pe 's/.*(up.*), [[:digit:]]+ user.*/$1/' <upfile
up 14 mins
up 52 days, 20:47
up 54 days, 1 min

Связанный контент