Come convogliare l'output di awk (con input periodico e continuo) nel file di output?


10

Sto cercando di scrivere un comando che convoglia l'output continuo di un comando libero (esegui ogni secondo) in un comando awk che analizza un valore specifico (memoria disponibile disponibile) e lo emette in un file con un timestamp. Ecco i miei attuali tentativi di comando:

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

E in alternativa, dopo un po 'di Google

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

Ogni esecuzione produce file vuoti. Qualche suggerimento o possibilmente metodi diversi?

Risposte:


13

Devi svuotare il buffer per vedere qualcosa memOutdurante l'esecuzione:

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

Ecco una versione alternativa:

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

Questo mi ha dato il file di output che volevo. Grazie!
Mark

3

Per le versioni precedenti di awkte potrebbe essere necessario utilizzare system("").

In realtà, fflush(stdout)è solo per le versioni recenti di awke gawk, in quanto è solo nello standard POSIX da dicembre 2012.

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

Si noti che l'utilizzo system("")annulla tutti i descrittori di file, la descrizione completa è nel gawkmanuale, sezione "9.1.4 Funzioni di input / output".


2

Solo per essere sicuro di ottenere ciò che realmente desideri e non quello che hai chiesto specificamente.

Se vuoi conoscere la memoria disponibile sul sistema per i programmi, questo potrebbe essere più adatto:

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

La colonna Usato della riga di memoria include cache e buffer e, nella maggior parte dei casi, quando si desidera monitorare l'utilizzo della memoria per un determinato computer / attività, questi dovrebbero almeno essere annotati.


2

Su alcune versioni di awk(ad esempio mawk 1.3.3) è necessario aggiungere il -W interactiveflag della riga di comando per abilitare il funzionamento senza buffer con i tubi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.