Como dividir uma linha por vários caracteres?

1

A saída de w | head -1 pode gerar dois resultados diferentes para minha 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

Preciso ter números médios de carga (por exemplo, 0.07, 0.13, 0.09 ). Como posso dividir a linha por load average: string para que eu possa sempre obter os números médios de carga para dois casos?

    
por NecNecco 05.10.2014 / 23:02

4 respostas

4

Normalmente, eu usaria apenas a ${parameter#word} expansão do parâmetro bash . Ele expande $parameter , excluindo word (que pode ser um padrão) desde o início.

No seu caso, algo como:

line=...
echo ${line#*load average: }

Tornando uma função:

get_load() {
    w | head -n 1 | { read -r line; echo ${line#*load average: }; }
}
    
por 05.10.2014 / 23:08
5

Você também pode usar o awk:

$ w | head -1 | awk '{print $10,$11,$12}'
0.80, 0.84, 0.93

Ou, se o número de campos for variável, use:

$ w | head -1 | awk '{print $(NF-2),$(NF-1),$NF}'
0.81, 0.82, 0.91

Ou, muito mais elegante ( obrigado @Letitzia ):

$ w | head -1 | awk -F "load average: " '{print $2}'

Sed:

$ w | head -1 | sed 's/.*load average: *//' 

Perl:

$ w | head -1 | perl -pe 's/.*load average: *//' 

ou

$ w | head -1 | perl -lne '/.*load average: *(.*)/ && print $1' 

Você pode usar colrm aqui, mas observe que ele remove "colunas", que são definidas como "um único caractere em uma linha". Portanto, embora funcione para o exemplo que você forneceu (por causa do espaço extra), isso não acontecerá se o número de colunas mudar ainda mais. Aqui, está excluindo as colunas de 1 a 51

$ w | head -1 | colrm 1 51
    
por 06.10.2014 / 00:20
3

Se você quiser apenas os últimos números, você pode usar o grep:

$ w | grep -Po 'load average: \K.*'
0.07, 0.13, 0.09
    
por 05.10.2014 / 23:06
0

Outro perl :

$ w | head -1 | perl -nle 'print +(split /load average:/)[-1]'
 0.42, 0.49, 0.63
    
por 06.10.2014 / 05:30

Tags