หากคุณต้องการ 10 บรรทัดสุดท้าย:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
แต่ด้วย GNU xargsคุณสามารถตั้งค่าตัวคั่นเป็นบรรทัดใหม่ด้วย:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0ย่อมาจาก-d '\0')
กระนั้นคุณก็สามารถหลบหนีตัวละครทุกตัวได้อย่างง่ายดาย:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
หรืออ้างแต่ละบรรทัด:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
หากคุณต้องการ 10 ระเบียน NUL คั่นล่าสุดmyFile.txt( แต่ก็ไม่คิดว่าจะเป็นไฟล์ข้อความ), คุณจะต้องแปลง\nไป\0ก่อนที่จะเรียกtailซึ่งจะหมายถึงไฟล์จะต้องได้รับอย่างเต็มที่อ่าน:
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
แก้ไข (ตั้งแต่คุณเปลี่ยนtailไปtail -fในคำถามของคุณ):
tail -fคนสุดท้ายที่ดังกล่าวข้างต้นเห็นได้ชัดไม่ทำให้ความรู้สึก
xargs -d '\n'หนึ่งจะทำงาน แต่สำหรับคนอื่น ๆ คุณจะมีปัญหาบัฟเฟอร์ ใน:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
trบัฟเฟอร์เอาต์พุตเมื่อไม่ได้ไปที่เทอร์มินัล (ที่นี่ไปป์) IE จะไม่เขียนอะไรเลยจนกว่าจะมีบัฟเฟอร์เต็ม (เช่น 8kiB) ของข้อมูลในการเขียน ซึ่งหมายความว่าmyCmdจะถูกเรียกเป็นชุด
ในระบบของกนูหรือ FreeBSD คุณสามารถปรับเปลี่ยนพฤติกรรมของบัฟเฟอร์trที่มีstdbufคำสั่ง:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2