
La salida de w | head -1
puede dar 2 resultados diferentes para mi máquina:
16:34:42 up 32 days, 3:02, 1 user, load average: 0.14, 0.11, 0.07
14:10:55 up 32 days, 39 min, 1 user, load average: 0.07, 0.13, 0.09
Necesito obtener números promedio de carga (por ejemplo 0.07, 0.13, 0.09
). ¿Cómo puedo dividir la línea por load average:
cadena para poder obtener siempre los números promedio de carga para dos casos?
Respuesta1
También puedes usar awk:
$ w | head -1 | awk '{print $10,$11,$12}'
0.80, 0.84, 0.93
O, si el número de campos es variable, utilice:
$ w | head -1 | awk '{print $(NF-2),$(NF-1),$NF}'
0.81, 0.82, 0.91
O, mucho más elegante (gracias @Letitzia):
$ w | head -1 | awk -F "load average: " '{print $2}'
Sede:
$ w | head -1 | sed 's/.*load average: *//'
Perla:
$ w | head -1 | perl -pe 's/.*load average: *//'
o
$ w | head -1 | perl -lne '/.*load average: *(.*)/ && print $1'
De hecho, puedes usarlo colrm
aquí, pero ten en cuenta que elimina las "columnas" que se definen como "un solo carácter en una línea". Entonces, si bien funciona para el ejemplo que proporcionó (debido al espacio adicional), no lo hará si el número de columnas cambia más. Aquí, está eliminando las columnas 1 a 51.
$ w | head -1 | colrm 1 51
Respuesta2
Normalmente solo usaría el${parameter#word}
expansión de parámetros de bash. Se expande $parameter
, eliminando word
(que puede ser un patrón) desde el principio.
En tu caso, algo como:
line=...
echo ${line#*load average: }
Convirtiéndolo en una función:
get_load() {
w | head -n 1 | { read -r line; echo ${line#*load average: }; }
}
Respuesta3
Si solo quieres los últimos números, puedes usar grep:
$ w | grep -Po 'load average: \K.*'
0.07, 0.13, 0.09
Respuesta4
Otro perl
:
$ w | head -1 | perl -nle 'print +(split /load average:/)[-1]'
0.42, 0.49, 0.63