tail -f path
ด้านบนจะแก้ไขการส่งออกไปยังไฟล์ได้ทันที แต่ฉันต้องการที่จะใช้ตัวกรองกับการส่งออกจะแสดงเฉพาะเมื่อมีคำหลักxxx
ในนั้น
วิธีการนี้
tail -f path
ด้านบนจะแก้ไขการส่งออกไปยังไฟล์ได้ทันที แต่ฉันต้องการที่จะใช้ตัวกรองกับการส่งออกจะแสดงเฉพาะเมื่อมีคำหลักxxx
ในนั้น
วิธีการนี้
คำตอบ:
ด้วย Unix คุณสามารถไพพ์เอาท์พุทของโปรแกรมหนึ่งไปยังอีกโปรแกรมหนึ่งได้
ดังนั้นในการกรองหางคุณสามารถใช้ grep:
tail -f path | grep your-search-filter
คำตอบสั้น ๆ : tail -f somefile | grep somepattern
อย่างไรก็ตามสิ่งนี้มีแนวโน้มที่จะสั้น สมมติว่าคุณกำลังปรับไฟล์ที่หมุนบ่อยๆ (ถ้าเป็นไฟล์บันทึกการดีบั๊กมันอาจหมุนหลายครั้ง) ในกรณีtail -F
นั้นคือเพื่อนของคุณ ฉันจะให้คุณค้นหาความแตกต่าง
แต่tail -f
และtail -F
พิมพ์ออกมาเป็นกลุ่มบรรทัดแรกซึ่งมักจะเป็นที่ไม่พึงประสงค์ในกรณีใช้งานนี้ดังนั้นในกรณีนี้เพิ่ม-n0
tail -F -n0 somefile | grep somepattern
มันจะใช้ได้จนกระทั่งคุณต้องการทำการกรองอื่น ๆ แล้วคุณต้องระวังการบัฟเฟอร์ stdout ถูกบัฟเฟอร์บรรทัดตามค่าเริ่มต้นเมื่อเขียนไปยังเทอร์มินัลแต่เมื่อบัฟเฟอร์เต็มเมื่อเขียนไปยังไพพ์ ดังนั้นต่อไปนี้จะปล่อยบรรทัดทันทีที่พบเนื่องจากtail
มีการบัฟเฟอร์บรรทัดอย่างชัดเจน (หรือมันล้างเอาต์พุตที่ท้ายแต่ละบรรทัด) และgrep
ยังถูกบัฟเฟอร์บรรทัดเนื่องจากเอาต์พุตกำลังส่งไปยังเทอร์มินัลของคุณ:
tail -F -n0 somefile | grep somepattern
แต่คุณตัดสินใจที่จะใช้สิ่งที่ชอบawk
หรือcut
เพื่อประมวลผลผลลัพธ์เพิ่มเติม
tail -F -n0 somefile | grep somepattern | awk '{print $3}'
และตอนนี้คุณสงสัยว่าผลลัพธ์ของคุณหายไปที่ใด ... ขึ้นอยู่กับปริมาณของบันทึกคุณอาจพบว่าคุณได้รับผลผลิต แต่มันจะเป็นหน้าทีละครั้งเพราะตอนนี้ stdout ของgrep
ทำงานแบบเต็มบัฟเฟอร์ และเพื่อawk
รับอินพุตครั้งละ 4kB (โดยค่าเริ่มต้น)
ในกรณีนี้คุณสามารถบอกgrep
ให้ทำการสร้างบรรทัด stdout เสมอโดยใช้--line-buffered
ตัวเลือก
tail -F -n0 somefile | grep --line-buffered somepattern | ...
--line-buffered
อย่างไรก็ตามคำสั่งส่วนใหญ่ไม่ได้อะนาล็อกของ ในกรณีของเครื่องมือที่เขียนสคริปต์ได้มากกว่านี้คุณสามารถใช้ฟังก์ชั่นเพื่อล้างข้อมูลที่ส่งออก (เช่น. in awk
, ฟังก์ชั่นคือfflush()
, ซึ่งใช้ชื่อเดียวกันกับสำเนา C, เครื่องมือเช่น Perl และ Python มีบางสิ่งที่คล้ายกัน)
ด้วยการที่cut
คุณชอบคุณจะไม่มีโชค ... แต่คุณอาจลองค้นหาunbuffer
ซึ่งฉันคิดว่ามีบางอย่างที่expect
Toolchain จัดให้(ฉันไม่เคยใช้)
ฉันหวังว่าคุณจะพบว่ามีประโยชน์นี้
ไชโยคาเมรอน
และคุณสามารถใช้หลายท่อและ greps และแยกสิ่งต่าง ๆ ด้วย grep -v, รับ case insensitivity ด้วย grep -i, ฯลฯ
ie: tail -100f / var / log / messages | grep -V ACPI | grep -i ata
เริ่ม tailing 100 บรรทัดจากจุดสิ้นสุดและเก็บไว้ก่อนแยกบรรทัดใด ๆ กับ ACPI จากนั้นแสดงบรรทัดด้วย ata, ATA หรือการผสมผสานของเหล่านั้น
อีกวิธีที่สะดวกคือตัวเลือก ABC สำหรับบรรทัดหลัง, ก่อนหน้าและบริบท (บรรทัดก่อนและหลัง)