1) Vamos comparar as duas versões seguintes:
while sleep 0.1 ; do top -d 10 | grep Cpu ; done
#versus batch mode
while sleep 0.1 ; do top -d 10 -bn1 | grep Cpu ; done
Você verá que no primeiro exemplo o tempo é definido pelo intervalo de atualização de top
(definido para 10 segundos via -d 10
), enquanto no segundo o comando sleep
no loop while é o limite . Observe que também top
nunca termina no primeiro exemplo, o que torna o processamento de qualquer saída canalizada um problema, já que o programa que lê stin
nunca recebe um sinal "process ended" que é especialmente um problema para programas baseados em coluna awk
ou cut
. Veja como, por exemplo,
top -d 0.1 -b | grep Cpu | cut -d' ' -f1
não produzirá saída nos intervalos top
produz, mas em lotes irregulares, enquanto
while sleep 0.1 ; do top -bn1 | grep Cpu | cut -d' ' -f1 ; done
produz saída nos intervalos desejados.
Longa história curta: use while
loop E top -bn1
2) awk
processamento:
Com stin
lido de top -bn1 | grep Cpu
, você pode usar:
awk 'BEGIN { FS == " +" } ; { cmd1="date +%Y-%m-%d" ; cmd2="date +%H:%M:%S" ; while ( cmd1 | getline a ) ; while ( cmd2 | getline b) ; print a,b,($2+$4)/($2+$4+$8)*100"%" }'
Como BEGIN { FS == " +" }
usará um ou mais espaços ( +
) como separadores de campo, os respectivos campos para nós, sy e id serão de $ 2, $ 4 e $ 8.
A solução alternativa com cmd1="..." ; while ( cmd1 | getline a)
é necessária para ler o resultado de uma chamada do sistema como variável no awk. Veja a resposta @ ghostdog74 aqui