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

9

Estou tentando escrever um comando que canaliza a saída contínua de um comando free (executado 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 timestamp. Aqui estão minhas tentativas atuais no comando:

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

E, alternativamente, depois de pesquisar um pouco

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

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

    
por Mark 16.01.2012 / 20:19

3 respostas

12

Você precisa 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
    
por 16.01.2012 / 20:48
3

Para versões antigas de awk , talvez você precise usar system("") .

Na verdade, 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

Observe que usar system("") libera todo descritor de arquivo, seu descrição completa está na seção gawk manual," 9.1.4 Funções de entrada / saída ".

    
por 04.02.2013 / 11:29
2

Só para ter certeza de que você está obtendo o que você quer e não o que você pediu especificamente.

Se você deseja conhecer 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 Used 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 anotados, pelo menos.

    
por 16.01.2012 / 23:01

Tags