
Quando executo o comando "uptime" no meu Mac, recebo esta saída:
19:52 up 14 mins, 2 users, load averages: 2.95 4.19 4.31
Isso muda um pouco dependendo de quanto tempo o sistema fica ativo, adicionando horas e depois dias. Assim, gostaria de remover a primeira palavra mais espaço e 4 caracteres antes de "usuários".
Fazendo19:52 up 14 mins, 2 users, load averages: 2.95 4.19 4.31
esse:
up 14 min
Ou
8:03 up 52 days, 20:47, 3 users, load averages: 1.36 1.42 1.40
esse:
up 52 days, 20:47
Ou:
22:19 up 54 days, 1 min, 4 users, load averages: 2.08 2.06 2.27
esse:
up 54 days, 1 min
Até agora, o máximo que consegui foi usar isso: uptime | cut -d " " -f2- | sed 's/users.*//'
mas isso ainda me dá um espaço antes de "up" e ainda preciso remover 4 caracteres no final da string. Alguém pode me educar?
Responder1
Eu uso isso (adaptar para incluir unidades, se necessário):
#!/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")
}
Responder2
Tentar:
sed -E 's/.*(up.*), [[:digit:]]+ user.*/\1/'
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.*/\1/' <upfile
up 14 mins
up 52 days, 20:47
up 54 days, 1 min
Como funciona
Usamos um comando substituto:
s/.*(up.*), [[:digit:]]+ user.*/\1/
As primeiras
.*
partidas do início da linha.(up.*)
corresponde à palavra up e ao texto a seguir e salva-o no grupo 1., [[:digit:]]+ users
corresponde a uma vírgula, seguida por um espaço, seguida por um ou mais dígitos, seguida por um espaço, seguida pela stringusers
.O segundo
.*
corresponde a tudo depoisuser
.
Substituímos tudo isso pelo grupo 1, denotado \1
.
Compatibilidade
O acima deve funcionar tanto no BSD/OSX quanto no Linux moderno. Em Linux muito antigo, pode ser necessário substituir -E
por -r
:
sed -r 's/.*(up.*), [[:digit:]]+ user.*/\1/'
Versão Perl
$ perl -pe 's/.*(up.*), [[:digit:]]+ user.*/$1/' <upfile
up 14 mins
up 52 days, 20:47
up 54 days, 1 min