Analizar el "tiempo de actividad" solo por la duración

Analizar el "tiempo de actividad" solo por la duración

Cuando ejecuto el comando "uptime" en mi Mac obtengo este resultado:

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

Esto cambia ligeramente dependiendo de cuánto tiempo esté activo el sistema, agregando horas y luego días. Por lo tanto, me gustaría eliminar la primera palabra más el espacio y 4 caracteres antes de "usuarios".

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

este:

up 14 min

O

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

este:

up 52 days, 20:47

O:

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

este:

up 54 days, 1 min

Hasta ahora, lo más lejos que puedo llegar es usar esto: uptime | cut -d " " -f2- | sed 's/users.*//'pero todavía me da un espacio antes de "arriba" y todavía necesito eliminar 4 caracteres al final de la cadena. ¿Alguien puede educarme?

Respuesta1

Yo uso esto (adaptaré para incluir unidades si es necesario):

#!/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")
    }

Respuesta2

Intentar:

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

Ejemplos

Estos son los ejemplos de la pregunta:

$ 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

El comando sed produce:

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

Cómo funciona

Usamos un comando sustituto:

s/.*(up.*), [[:digit:]]+ user.*/\1/
  • Los primeros .*partidos desde el principio de la línea.

  • (up.*)relaciona la palabra arriba y el texto que sigue y lo guarda en el grupo 1.

  • , [[:digit:]]+ userscoincide con una coma, seguida de un espacio, seguida de uno o más dígitos, seguida de un espacio y seguida de la cadena users.

  • El segundo .*coincide con todo lo que sigue user.

Reemplazamos todo eso con el grupo 1, denotado \1.

Compatibilidad

Lo anterior debería funcionar tanto en BSD/OSX como en Linux moderno. En Linux muy antiguo, es posible que sea necesario reemplazarlo -Econ -r:

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

versión Perl

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

información relacionada