Tente:
sed -E 's/.*(up.*), [[:digit:]]+ user.*//'
Exemplos
Estes são os exemplos da pergunta:
$ 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
O comando sed produz:
$ sed -E 's/.*(up.*), [[:digit:]]+ user.*//' <upfile
up 14 mins
up 52 days, 20:47
up 54 days, 1 min
Como funciona
Nós usamos um comando substituto:
s/.*(up.*), [[:digit:]]+ user.*//
-
O primeiro
.*
corresponde ao início da linha. -
(up.*)
corresponde à palavra e ao texto a seguir e salva no grupo 1. -
, [[:digit:]]+ users
corresponde a uma vírgula, seguida por um espaço, seguido por um ou mais dígitos, seguido por um espaço, seguido pela stringusers
. -
O segundo
.*
corresponde a tudo depois deuser
.
Substituímos tudo isso pelo grupo 1, denotado .
Compatibilidade
Isso acima deve funcionar tanto no BSD / OSX quanto no Linux moderno. Em um Linux muito antigo, pode ser necessário substituir -E
por -r
:
sed -r 's/.*(up.*), [[:digit:]]+ user.*//'
versão Perl
$ perl -pe 's/.*(up.*), [[:digit:]]+ user.*/$1/' <upfile
up 14 mins
up 52 days, 20:47
up 54 days, 1 min