
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:]]+ users
coincide con una coma, seguida de un espacio, seguida de uno o más dígitos, seguida de un espacio y seguida de la cadenausers
.El segundo
.*
coincide con todo lo que sigueuser
.
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 -E
con -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