Como canalizar saída awk (com entrada periódica, contínua) para o arquivo de saída?


9

Eu estou tentando escrever um comando que canaliza a saída contínua de um livre comando (executar a cada segundo) para um comando awk que analisa um valor específico (memória livre disponível) e envia isso para um arquivo com um registro de data e hora. Aqui estão minhas tentativas atuais no comando:

free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4 }' >>memOut

E alternativamente, depois de um pouco de pesquisando

free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4 >>"memOut"}'

Cada execução produz arquivos vazios. Alguma sugestão ou possivelmente diferentes métodos?

Respostas:


12

Você tem que liberar o buffer para ver algo em memOut durante a execução:

free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4; fflush(stdout) }' >> memOut

Aqui está uma versão alternativa:

while sleep 1; do sed -n "s/MemFree: */`date`, /p" /proc/meminfo; done >> memOut

Isso me deu o arquivo de saída que eu queria. Obrigado!
Mark

3

Para versões antigas de awk você pode ter que usar system("").

Na realidade, fflush(stdout) é apenas para versões recentes de awk e gawk, como é o único no padrão POSIX desde dezembro de 2012.

free -mto -s 1 | awk '/Mem/ { 
    print strftime("%r") "," $4;
    system(""); # Flush output
}' >> memOut

Note que usando system("") libera todos os descritores de arquivos, descrição completa está no gawk manual, seção "9.1.4 Funções de entrada / saída".


2

Apenas para ter certeza de que você está recebendo o que realmente quer e não o que você pediu especificamente.

Se você quiser saber a memória disponível no sistema para programas, isso pode ser mais adequado:

free -m -s 1 | awk '/buffers\/cache/ { print strftime("%r") "," $4; fflush(stdout) }' >> memOut

A coluna Usada da linha Mem inclui caches e buffers e, na maioria dos casos, quando você deseja monitorar o uso de memória para determinado computador / tarefa, esses devem ser, pelo menos, anotados.


0

Em certas versões de awk (por exemplo, mawk 1.3.3) você precisa adicionar o -W interactive sinalizador de linha de comando para habilitar a operação sem buffer com pipes.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.