
A saída de w | head -1
pode fornecer 2 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 obter números médios de carga (por exemplo 0.07, 0.13, 0.09
). Como posso dividir a linha por load average:
string para poder sempre obter os números médios de carga para dois casos?
Responder1
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, o 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'
Na verdade, você pode usar colrm
aqui, mas observe que ele remove "colunas" definidas como "um único caractere em uma linha". Portanto, embora funcione para o exemplo que você forneceu (por causa do espaço extra), não funcionará se o número de colunas mudar ainda mais. Aqui, está excluindo as colunas 1 a 51
$ w | head -1 | colrm 1 51
Responder2
Normalmente eu apenas usaria o${parameter#word}
expansão do parâmetro bash. Ele se 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-o uma função:
get_load() {
w | head -n 1 | { read -r line; echo ${line#*load average: }; }
}
Responder3
Se você quiser apenas os últimos números, você pode usar grep:
$ w | grep -Po 'load average: \K.*'
0.07, 0.13, 0.09
Responder4
Outro perl
:
$ w | head -1 | perl -nle 'print +(split /load average:/)[-1]'
0.42, 0.49, 0.63