Analisa o 'tempo de atividade' apenas pela duração

2

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 está ativo, adicionando horas e dias. Assim, gostaria de remover a primeira palavra mais espaço e 4 caracteres antes de "usuários".

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

isto:

up 14 min

Ou

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

isto:

up 52 days, 20:47

Ou:

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

isto:

up 54 days, 1 min

Até agora, o mais longe que posso conseguir é 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?

    
por Tony 02.12.2017 / 05:01

2 respostas

1

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 string users .

  • O segundo .* corresponde a tudo depois de user .

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
    
por 02.12.2017 / 06:20
2

Eu uso isso (adapte 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")
    }
    
por 02.12.2017 / 05:09