ตัดต่อไฟล์บันทึก แต่แสดงเฉพาะบรรทัด


29

ฉันกำลังปรับแต่งไฟล์บันทึกด้วยแฟล็ก -f จากนั้นฉันก็ส่งข้อมูลนี้ไปที่ grep เพื่อค้นหาเฉพาะบรรทัดที่มี "X" มันใช้งานได้ดีอย่างสมบูรณ์แบบ ตอนนี้ฉันต้องการไพพ์นี้อีกครั้งเป็น grep อื่นซึ่งจะลบบรรทัดทั้งหมดที่มี "Y" เมื่อฉันเพิ่มไพพ์ที่สองไฟล์จะหยุดรีเฟรชและดูเหมือนว่าไม่มีข้อมูลมา

นี่คือคำสั่งที่ใช้งานได้: tail -f my_file.log | grep "X"

นี่คือคำสั่งที่ไม่: tail -f my_file.log | grep "X" | grep -v "Y"

ฉันควรจัดโครงสร้างสิ่งนี้อย่างไรเพื่อให้คำสั่งทำงานได้?


1
tail -f file|grep -v "Y"พยายามที่จะทำอย่างใดอย่างหนึ่งโดยหนึ่งในท่อท่อเปลี่ยนลำดับการทำ grep "X"ถ้าเอาท์พุทก็โอเคแล้วดำเนินการผนวก
Aizuddin Zali

คำตอบ:


38

เนื่องจากเอาต์พุตของgrepถูกบัฟเฟอร์ให้ใช้--line-bufferedอ็อพชันของgrepเพื่อเปิดใช้งานการบัฟเฟอร์บรรทัด:

tail -f /path/to/log | grep --line-buffered 'X' | grep -v 'Y'

หากgrepไม่มีตัวเลือกของคุณคุณสามารถใช้stdbufเป็นทางเลือก:

tail -f /path/to/log | stdbuf -oL grep 'X' | grep -v 'Y'

1
ฉันสงสัยว่าstdbufจะบอกlibstdbuf.soการตั้งค่าที่จะใช้อย่างไร
kasperd

@kasperd: ตัวแปรสภาพแวดล้อม
Nate Eldredge

1
@NateEldredge ฉันค้นหาตัวแปรสภาพแวดล้อมในผลลัพธ์diff -u <(env) <(stdbuf env)แล้วและไม่พบเลย diff -u <(env) <(stdbuf -oL env)แต่ตอนนี้ฉันรู้ว่าสิ่งที่ฉันควรจะได้รับการทดสอบเป็น
kasperd

ฉันก็เป็นปัญหาแบบเดียวกัน กรณีของฉันคือฉันต้องพิมพ์ทุกบรรทัดที่มี 'aaa' และ 'bbb' วิธีแก้ปัญหาข้างต้นไม่ทำงาน วิธีแก้ปัญหาที่สองใช้งานได้สำหรับ 'aaa' มีอยู่และ 'bbb' ไม่มีอยู่ ทั้งสองมีอยู่ไม่ทำงาน ให้ไม่มีการส่งออก คำสั่งของฉันมีลักษณะเช่นนี้: tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb' มันไม่ได้ให้ผลลัพธ์ใด ๆ คุณช่วยฉันหน่อยได้ไหม.
อาทิตย์

18

ฉันมักจะพบว่ามีประโยชน์มากขึ้นawkสำหรับการตรวจสอบทางตรรกะเหล่านี้:

tail -f /path/to/log | awk '/X/ && !/Y/'
#                           ^^^    ^^^^
#                   this I want    but not this

ผ่านการทดสอบโดยมีสองแท็บหนึ่งในสิ่งที่ฉันให้เขียนseq 20 >> myfileและคนอื่น ๆ tail -f myfile | awk '/3/ && !/13/'ที่มีเช่น


15

อีกวิธีหนึ่งคือใช้การgrepเรียกใช้ครั้งเดียวแทนที่จะเป็นแบบสองข้อดังนั้นหลีกเลี่ยงปัญหาการบัฟเฟอร์ เพียงใช้นิพจน์ทั่วไปที่ตรงกับบรรทัดที่ประกอบด้วยอักขระที่ไม่ใช่ Y ตั้งแต่ 0 ขึ้นไปจากนั้น X และจากนั้น 0 หรือมากกว่าไม่ใช่ Y อีกครั้งจนถึงจุดสิ้นสุดของบรรทัด "

tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.