เป็นไปได้ที่จะทำtail -f
(หรือคล้ายกัน) ในไฟล์และgrep
ในเวลาเดียวกัน? ฉันจะไม่รังเกียจคำสั่งอื่น ๆ เพียงแค่มองหาพฤติกรรมแบบนั้น
เป็นไปได้ที่จะทำtail -f
(หรือคล้ายกัน) ในไฟล์และgrep
ในเวลาเดียวกัน? ฉันจะไม่รังเกียจคำสั่งอื่น ๆ เพียงแค่มองหาพฤติกรรมแบบนั้น
คำตอบ:
ใช้ GNU tail
และ GNU grep
ฉันสามารถ grep a tail -f
โดยใช้ไวยากรณ์ตรงไปข้างหน้า:
tail -f /var/log/file.log | grep search_term
มันจะทำงานได้ดี โดยทั่วไปgrep
จะรอเมื่อโปรแกรมไม่ออกและอ่านต่อไปเมื่อมีการส่งออกดังนั้นหากคุณทำสิ่งต่อไปนี้
$ (echo foo; sleep 5; echo test; sleep 5) | grep test
จะไม่มีอะไรเกิดขึ้นเป็นเวลา 5 วินาทีจากนั้น grep จะส่งออก "test" ที่ตรงกันแล้วห้าวินาทีต่อมามันจะออกเมื่อกระบวนการ piped ทำ
เพิ่ม--line-buffered
ไปยังgrep
และนั่นอาจลดความล่าช้าสำหรับคุณ มีประโยชน์มากในบางกรณี
tail -f foo | grep --line-buffered bar
grep
ไม่ไปที่เทอร์มินัล (เปลี่ยนเส้นทางไปยังไฟล์ประเภทอื่น) การบัฟเฟอร์บรรทัดเป็นค่าเริ่มต้นเมื่อเอาต์พุตไปยังเทอร์มินัลดังนั้นมันจะไม่สร้างความแตกต่างเลย โปรดทราบว่าตัวเลือกนั้นเป็น GNU เฉพาะ
คุณก็สามารถท่อส่งออกของgrep
tail -f
เข้า นอกจากนี้ยังมีโปรแกรมที่รวมtail -f
ฟังก์ชันการทำงานกับการกรองและการระบายสีในMultitailเฉพาะ( ตัวอย่าง )
ฉันเห็นคนเหล่านี้บอกว่าจะใช้tail -f
แต่ฉันไม่ชอบข้อ จำกัด ของมัน! วิธีที่ฉันโปรดปรานในการค้นหาไฟล์ในขณะที่มองหาบรรทัดใหม่ (เช่นฉันมักจะทำงานกับล็อกไฟล์ซึ่งต่อท้ายผลลัพธ์ที่เปลี่ยนเส้นทางของกระบวนการที่ดำเนินการเป็นระยะผ่านงาน cron) คือ:
tail -Fn+0 /path/to/file|grep searchterm
นี่ถือว่า GNU หางและ grep สนับสนุนรายละเอียดจาก manpage หาง (GNU coreutils, เหมืองคือ v8.22) [ https://www.gnu.org/software/coreutils/manual/coreutils.html] :
-F same as --follow=name --retry -n, --lines=K output the last K lines, instead of the last 10; or use -n +K to output starting with the Kth. If the first character of K (the number of bytes or lines) is a '+', print beginning with the Kth item from the start of each file, otherwise, print the last K items in the file. K may have a multiplier suffix: b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y. With --follow (-f), tail defaults to following the file descriptor, which means that even if a tail'ed file is renamed, tail will continue to track its end. This default behavior is not desirable when you really want to track the actual name of the file, not the file descriptor (e.g., log rotation). Use --follow=name in that case. That causes tail to track the named file in a way that accommodates renaming, removal and creation.
ดังนั้นส่วนหางของคำสั่งของฉันเท่ากับtail --follow --retry --lines=+0
ที่ที่อาร์กิวเมนต์สุดท้ายชี้นำให้เริ่มต้นที่จุดเริ่มต้นข้ามเส้นศูนย์
tail -f access | awk '/ADD/{print $0}'
ใช้ข้างต้นฉันใช้มันมักจะ
คุณสามารถใช้ netcat เพื่อ grep ผลลัพธ์ของ tail -f เนื่องจากผลลัพธ์ใหม่เข้ามาค่อนข้างง่าย
sudo nc -s localhost -l -p 1337 | grep ssh
tail -f /var/log/file.log | nc 127.0.0.1 1337
ชุดนี้ grep ฟังผลลัพธ์สำหรับอินพุตที่มาจากพอร์ต 1337
คำสั่งที่สองไพพ์เอาต์พุตของ tail -f ไปยัง netcat และส่งออก localhost 1337 หากต้องการทำภายในเครื่องคุณต้องสลับ ttys สำหรับคำสั่งสองชุด หรือใช้บางอย่างเช่นหน้าจอ
มันได้ผล. แต่ระวังว่าเอาต์พุตไม่ได้เกิดขึ้นทันที: มันถูกบัฟเฟอร์ผ่านท่อ
tail -f
ในหน้าต่างหนึ่งและtail -f logfile | grep pattern
ในหน้าต่างอื่น บรรทัดที่มีpattern
ไม่ปรากฏในหน้าต่างทั้งสองในเวลาเดียวกัน ฉันเคยเห็นเส้นปรากฏขึ้น 30 วินาทีในบางโอกาสซึ่งเป็นเรื่องที่น่ารำคาญ
tee
หรือบางสิ่งบางอย่าง