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