ท่อจาก grep ไปยัง awk ไม่ทำงาน


34

ฉันพยายามที่จะบันทึกไฟล์grepอย่างต่อเนื่องtailและได้nคำจากบรรทัด ไฟล์ตัวอย่าง:

$ cat > test.txt <<EOL
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
EOL
^C

ตอนนี้ถ้าฉันทำtail:

$ tail -f test.txt
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
^C

ถ้าฉันgrepว่าtail:

$ tail -f test.txt | grep Beam
Beam goes blah
Beam goes what?
Beam goes okay
Beam goes bye
^C

แต่ถ้าฉันawkว่าgrep:

$ tail -f test.txt | grep Beam | awk '{print $3}'

ไม่ว่าฉันจะรอนานแค่ไหน ฉันสงสัยว่ามันเป็นเรื่องเกี่ยวกับวิธีการทำงานของสตรีม

ใครมีเบาะแสบ้าง

คำตอบ:


55

มันอาจจะเป็นบัฟเฟอร์เอาต์พุตจาก grep grep --line-bufferedคุณสามารถปิดการใช้งานที่มี

แต่คุณไม่จำเป็นต้องไพพ์เอาต์พุตจาก grep ไปยัง awk awk สามารถทำรูปแบบ regexp ที่ตรงกับตัวเองทั้งหมด

tail -f test.txt | awk '/Beam/ {print $3}'


8

ใช้tail -f test.txt | awk '/Beam/{print $3}'งานให้ฉัน เช่นเดียวกับการใช้tail -f test.txt | grep --line-buffered Beam | awk '{print $3}'(gnu grep)

ปัญหาที่นี่คือถ้าawkได้รับ data line-by-line หรือเป็นหนึ่ง data block ขนาดใหญ่ grep รุ่น GNU ส่งเอาต์พุตเป็นบล็อคขนาดใหญ่เนื่องจากมีประสิทธิภาพมากกว่า แต่awkจำเป็นต้องอ่านแบบบรรทัดต่อบรรทัดเพื่อส่งออกบรรทัดต่อบรรทัด

ใส่ด้วยวิธีนี้: grepจะส่งข้อมูลเมื่อบัฟเฟอร์เต็มเท่านั้น awk กำลังรอให้บัฟเฟอร์นั้นเต็มดังนั้นจะไม่มีการส่งข้อมูลใด ๆ


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