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
( -0
kependekan 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 \n
ke \0
sebelum memanggil tail
yang 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 tail
ke tail -f
dalam 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
tr
buffer 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 myCmd
akan dipanggil dalam batch.
Pada sistem GNU atau FreeBSD, Anda dapat mengubah perilaku buffering tr
dengan stdbuf
perintah:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2
tail -f myFile.txt | xargs -r0i -d '\n' myCmd "{}" "||" "||"
tampaknya bekerja! Terima kasih.-i
opsi mengambil argumen opsional, jadi-i0
tidak akan berfungsi. Mereka semua harus bekerja dengantail -f
kecuali yang terakhir, tetapi berhati-hatilah karena karena buffering, akan ada penundaan sebelumxargs
mendapat input daritr
. Anda dapat mengubahnya dengan menjalankanstdbuf -o0 tr '\n' '\0'
alih-alihtr '\n' '\0'
.