O redirecionamento de saída do Linux não funciona com o awk

0

Estou tentando escrever um arquivo csv com base em alguma saída do topo. Eu reformatar a saída com o awk assim:

top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }'

Isso funciona perfeitamente. Agora quero salvar a saída em um arquivo. Eu acho que usar > output.log deve funcionar:

top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }' > output.log

No entanto, isso simplesmente resulta em um arquivo vazio quando eu ctrl-c fora do processo de topo. O que estou fazendo errado?

    
por XerXes 08.11.2012 / 17:00

2 respostas

1

A biblioteca de E / S padrão ("stdio") do Unix detecta que tipo de coisa (coletor de dados) ela está gravando. Se detectar um terminal (por exemplo, uma janela), ele gravará dados imediatamente quando o programa os solicitar. Ao gravar em um arquivo, no entanto, a biblioteca de E / S armazena dados em buffer e os grava em blocos de 512 (ou mais) bytes por vez. É claro que ele libera o buffer (escrevendo um bloqueio parcial) quando o programa de chamada é encerrado - se ele sair de forma limpa. Um término anormal (como causado por Ctrl + C ) pode deixar você com um arquivo de saída incompleto.

Para corrigir, tente:

top -b | ( trap "" 2; nawk '(your nawk command)' > output.log)'

O comando trap tornará o comando nawk imune ao Ctrl + C . (É claro que a Ctrl + C ainda irá matar o processo top , e nawk terminará (limpa!) Quando receber um fim de arquivo (EOF) no tubo.

P.S. Isso pressupõe (requer) que você esteja executando bash ou um shell compatível com bash .

    
por 08.11.2012 / 18:00
0

Top continua correndo. Você quer executá-lo uma quantidade limitada de vezes. Use a opção -n. assim:

top -b -n 1 | awk '{ ... }'

Alternativamente, você pode sair do topo quando tiver vontade de fazer isso com C- \. Usando C-c irá abortar e quebrar o pipe prematuramente (antes do awk receber qualquer coisa).

$ top -b | cat -n > moo ; wc -l moo
^\Quit
352 moo
    
por 08.11.2012 / 18:24