
Когда я запускаю команду «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