Bagaimana menyalurkan output awk (dengan input berkala dan kontinu) ke file output?

10

Saya mencoba untuk menulis perintah yang menyalurkan output terus-menerus dari perintah bebas (jalankan setiap detik) ke perintah awk yang mem-parsing nilai tertentu (memori bebas yang tersedia) dan menampilkan ini ke file dengan timestamp. Berikut adalah upaya saya saat ini pada perintah:

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

Atau sebagai alternatif, setelah sedikit Googling

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

Setiap proses menghasilkan file kosong. Ada saran atau metode yang mungkin berbeda?

Menandai
sumber

Jawaban:

13

Anda harus membuka buffer untuk melihat sesuatu memOutselama eksekusi:

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

Ini versi alternatifnya:

while sleep 1; do sed -n "s/MemFree: */`date`, /p" /proc/meminfo; done >> memOut
cYrus
sumber
Ini memberi saya file output yang saya inginkan. Terima kasih!
Tandai
3

Untuk versi lama awkAnda mungkin harus menggunakan system("").

Sebenarnya, fflush(stdout)ini hanya untuk versi terbaru awkdan gawk, sebagai satu-satunya dalam standar POSIX sejak Desember 2012.

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

Perhatikan bahwa menggunakan system("")flushes setiap deskriptor file, deskripsi lengkapnya ada di gawkmanual, bagian "9.1.4 Fungsi Input / Output".

Steve Schnepp
sumber
2

Hanya untuk memastikan bahwa Anda mendapatkan apa yang sebenarnya Anda inginkan dan bukan apa yang Anda minta secara spesifik.

Jika Anda ingin mengetahui memori yang tersedia pada sistem untuk program maka ini mungkin lebih cocok:

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

Kolom Digunakan baris Mem mencakup cache dan buffer dan dalam kebanyakan kasus ketika Anda ingin memantau penggunaan memori untuk komputer / tugas tertentu, setidaknya harus diperhatikan.

Manwe
sumber
2

Pada versi tertentu awk(mis. Mawk 1.3.3), Anda perlu menambahkan -W interactiveflag baris perintah untuk mengaktifkan operasi tanpa gangguan dengan pipa.

Pierz
sumber