Son 10 satırı istiyorsanız:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
Ancak GNU ile xargs
, sınırlayıcıyı aşağıdakilerle yeni satıra ayarlayabilirsiniz:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0
kısaltmasıdır -d '\0'
).
Taşınabilir olarak, her karakterden de kaçabilirsiniz:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
Veya her satırı alıntılayın:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
NUL ile sınırlandırılmış son 10 kaydını myFile.txt
istiyorsanız (ancak bu bir metin dosyası olmazsa), çağrılmadan önce to değerini dönüştürmeniz gerekir \n
; bu, dosyanın tam olarak okunması gerektiği anlamına gelir:\0
tail
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
Düzen (değişmesini beri tail
hiç tail -f
sorunuzu):
Yukarıdaki sonuncusu açıkça mantıklı değil tail -f
.
xargs -d '\n'
Biri çalışacaktır ancak diğer olanlar için, bir tamponlama sorunu olacak. İçinde:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tr
bir terminale gitmediğinde çıkışını tamponlar (burada bir boru). IE, yazmak için veri dolu bir tampon (8kiB gibi bir şey) birikinceye kadar hiçbir şey yazmaz. Hangi araçlar myCmd
gruplar halinde çağrılacaktır.
Bir GNU veya FreeBSD sisteminde, arabelleğe alma davranışını tr
şu stdbuf
komutla değiştirebilirsiniz:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2