![O redirecionamento de saída do Linux não funciona com o awk](https://rvso.com/image/1337795/O%20redirecionamento%20de%20sa%C3%ADda%20do%20Linux%20n%C3%A3o%20funciona%20com%20o%20awk.png)
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.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 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 '
(seunawk
comando)' > output.log)
`
O trap
comando tornará o nawk
comando imune ao Ctrl+ C. (É claro que o Ctrl+ Cainda encerrará o top
processo e nawk
terminará (de forma limpa!) quando chegar ao fim do arquivo (EOF) no canal.
PS Isso pressupõe (requer) que você esteja executando bash
um bash
shell 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