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
( -0
viế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 \n
thành \0
trướ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 tail
thành tail -f
trong 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à myCmd
sẽ đượ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 tr
với stdbuf
lệnh:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2