วิธีไพพ์เอาต์พุต awk (ที่มีอินพุตต่อเนื่องเป็นระยะ) ไปยังไฟล์เอาต์พุต


10

ฉันพยายามเขียนคำสั่งที่ไพพ์เอาต์พุตต่อเนื่องของคำสั่งfree (รันทุกวินาที) ไปยังคำสั่ง awk ที่วิเคราะห์ค่าเฉพาะ (หน่วยความจำว่างที่มีอยู่) และเอาต์พุตนี้ไปยังไฟล์ที่มีการประทับเวลา นี่คือความพยายามในปัจจุบันของฉันที่คำสั่ง:

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

และอีกทางเลือกหนึ่งหลังจาก Googling

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

การทดสอบแต่ละครั้งจะสร้างไฟล์เปล่า ข้อเสนอแนะหรือวิธีการที่แตกต่างกันอาจจะ?

คำตอบ:


13

คุณต้องล้างบัฟเฟอร์เพื่อดูบางสิ่งในmemOutระหว่างการดำเนินการ:

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

นี่คือรุ่นอื่น:

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

นี่ให้ไฟล์เอาต์พุตที่ฉันต้องการ ขอบคุณ!
Mark

3

สำหรับรุ่นเก่าของคุณอาจจะต้องใช้awksystem("")

ที่จริงแล้วfflush(stdout)มีไว้สำหรับรุ่นล่าสุดเท่านั้นawkและgawkเป็นเฉพาะในมาตรฐาน POSIX ตั้งแต่เดือนธันวาคม 2012

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

โปรดทราบว่าการใช้system("")flushes ตัวอธิบายไฟล์ทุกตัวคำอธิบายแบบเต็มอยู่ในgawkคู่มือส่วน "9.1.4 ฟังก์ชั่นอินพุต / เอาต์พุต"


3

ในบางเวอร์ชันของawk(เช่น mawk 1.3.3) คุณต้องเพิ่มการ-W interactiveตั้งค่าสถานะบรรทัดคำสั่งเพื่อเปิดใช้งานการดำเนินการที่ไม่มีบัฟเฟอร์ด้วยไพพ์


2

เพียงเพื่อให้แน่ใจว่าคุณได้รับสิ่งที่คุณต้องการจริงและไม่ใช่สิ่งที่คุณถามโดยเฉพาะ

หากคุณต้องการทราบหน่วยความจำที่มีอยู่ในระบบสำหรับโปรแกรมนี่อาจเหมาะสมกว่า:

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

คอลัมน์ Used line ของ Mem มีแคชและบัฟเฟอร์และในกรณีส่วนใหญ่เมื่อคุณต้องการตรวจสอบการใช้หน่วยความจำสำหรับคอมพิวเตอร์ / งานที่กำหนดควรมีการบันทึกอย่างน้อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.