Jika Anda ingin 10 baris terakhir:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
Tetapi dengan GNU xargs, Anda juga dapat mengatur pembatas ke baris baru dengan:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0kependekan dari -d '\0').
Dengan mudah, Anda juga dapat melarikan diri dari setiap karakter:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
Atau kutip setiap baris:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
Jika Anda ingin 10 catatan terakhir dibatasi NUL myFile.txt(tapi kemudian itu bukan file teks), Anda harus mengonversikan \nke \0sebelum memanggil tailyang artinya file tersebut harus dibaca sepenuhnya:
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
Edit (karena Anda mengubah tailke tail -fdalam pertanyaan Anda):
Yang terakhir di atas jelas tidak masuk akal tail -f.
Yang xargs -d '\n'satu akan bekerja, tetapi untuk yang lain, Anda akan memiliki masalah buffering. Di:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
trbuffer hasilnya ketika tidak pergi ke terminal (di sini, sebuah pipa). IE, itu tidak akan menulis apa pun sampai ia mengumpulkan buffer penuh (seperti 8kiB) data untuk ditulis. Yang artinya myCmdakan dipanggil dalam batch.
Pada sistem GNU atau FreeBSD, Anda dapat mengubah perilaku buffering trdengan stdbufperintah:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2