¿Cómo dividir una línea entre varios caracteres?

¿Cómo dividir una línea entre varios caracteres?

La salida de w | head -1puede 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 colrmaquí, 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

información relacionada