Nếu bạn muốn 10 dòng cuối cùng:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
Nhưng với GNU xargs, bạn cũng có thể đặt dấu phân cách thành dòng mới với:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0viết tắt của -d '\0').
Có thể, bạn cũng có thể thoát khỏi mọi nhân vật:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
Hoặc trích dẫn từng dòng:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
Nếu bạn muốn 10 bản ghi được phân tách bằng NUL cuối cùng của myFile.txt(nhưng sau đó sẽ không phải là tệp văn bản), bạn phải chuyển đổi \nthành \0trước khi gọi tail, điều đó có nghĩa là tệp sẽ phải được đọc đầy đủ:
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
Chỉnh sửa (vì bạn đã thay đổi tailthành tail -ftrong câu hỏi của bạn):
Cái cuối cùng ở trên rõ ràng không có ý nghĩa cho tail -f.
Một xargs -d '\n'cái sẽ hoạt động, nhưng đối với những cái khác, bạn sẽ gặp vấn đề về bộ đệm. Trong:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
trđệm đầu ra của nó khi nó không đi đến một thiết bị đầu cuối (ở đây, một đường ống). IE, nó sẽ không ghi bất cứ điều gì cho đến khi nó tích lũy được một bộ đệm đầy (giống như 8kiB) dữ liệu để ghi. Có nghĩa là myCmdsẽ được gọi theo đợt.
Trên một hệ thống GNU hoặc FreeBSD, bạn có thể thay đổi hành vi của đệm trvới stdbuflệnh:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2