การบัฟเฟอร์บรรทัด grep ทำอะไรได้บ้าง


25

นี่คือคำสั่งของฉันที่ฉันใช้ในสคริปต์กับgrepข้อมูลตามเวลาจริง ดูเหมือนว่าจะดึงข้อมูลเรียลไทม์ไม่ถูกต้องเนื่องจากมันเพิ่งพลาดบางบรรทัด

tail -f <file> | fgrep "string" | sed 's/stuff//g' >> output.txt

คำสั่งต่อไปนี้จะทำอะไร? "การบัฟเฟอร์บรรทัด" คืออะไร

tail -f <file> | fgrep --line-buffered "string" | sed 's/stuff//g' >> output.txt

คำตอบ:


44

เมื่อมีการใช้ที่ไม่โต้ตอบคำสั่งมาตรฐานส่วนใหญ่รวมถึงบัฟเฟอร์การส่งออกที่มีความหมายมันไม่ได้เขียนข้อมูลทันทีgrep stdoutมันรวบรวมข้อมูลจำนวนมาก (ขึ้นอยู่กับระบบปฏิบัติการ, ใน Linux, มักจะ 4096 ไบต์) ก่อนที่จะเขียน

ในคำสั่งgrepของคุณเอาต์พุตของไพพ์จะเป็นstdinของsedคำสั่งดังนั้นgrepบัฟเฟอร์เอาต์พุต

ดังนั้น--line-bufferedตัวเลือกที่ทำให้เกิดการgrepใช้บัฟเฟอร์บรรทัดหมายถึงการเขียนเอาต์พุตในแต่ละครั้งที่เห็นบรรทัดใหม่แทนที่จะรอถึง 4096 ไบต์ตามค่าเริ่มต้น แต่ในกรณีนี้คุณไม่จำเป็นgrepเลยเพียงแค่ใช้tail+ sed:

tail -f <file> | sed '/string/s/stuff//g' >> output.txt

ด้วยคำสั่งที่ไม่มีตัวเลือกในการปรับเปลี่ยนบัฟเฟอร์คุณสามารถใช้GNU coreutils stdbuf

tail -f <file> | stdbuf -oL fgrep "string" | sed 's/stuff//g' >> output.txt

เพื่อเปิดการบัฟเฟอร์บรรทัดหรือใช้-o0เพื่อปิดการใช้งานบัฟเฟอร์

บันทึก

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