หากคุณต้องการ 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