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

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

Estou tentando escrever um arquivo csv legal com base em alguma saída do topo. Eu reformato a saída com 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 o uso > output.logdeve 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 saio do processo principal com Ctrl-C. O que estou fazendo de errado?

Responder1

A biblioteca de E/S padrão (“stdio”) do Unix detecta em que tipo de coisa (coletor de dados) ela está gravando. Se detectar um terminal (ou seja, uma janela), ele grava os dados imediatamente quando o programa os solicita. Ao gravar em um arquivo, entretanto, a biblioteca de E/S armazena os dados em buffer e os grava em blocos de 512 (ou mais) bytes por vez. É claro que ele libera o buffer (gravando um bloco parcial) quando o programa chamador termina - se ele sair de forma limpa. Um encerramento anormal (causado por Ctrl+ C) pode deixar você com um arquivo de saída incompleto.

Para corrigir, tente:

top -b | ( trap "" 2; nawk '(seu nawkcomando)' > output.log)`

O trapcomando tornará o nawkcomando imune ao Ctrl+ C. (É claro que o Ctrl+ Cainda encerrará o topprocesso e nawkterminará (de forma limpa!) quando chegar ao fim do arquivo (EOF) no canal.

PS Isso pressupõe (requer) que você esteja executando bashum bashshell compatível.

Responder2

Top continua funcionando. Você deseja executá-lo um número limitado de vezes. Use a opção -n. igual a:

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

Alternativamente, você pode sair do topo quando quiser com C-\. Usar Cc irá abortá-lo e quebrar o cano prematuramente (antes que o awk consiga alguma coisa).

$ top -b | cat -n > moo ; wc -l moo
^\Quit
352 moo

informação relacionada