Se você deseja as últimas 10 linhas:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
Mas com o GNU xargs
, você também pode definir o delimitador para nova linha com:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0
é a abreviação de -d '\0'
).
Portably, você também pode simplesmente escapar de todos os personagens:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
Ou cite cada linha:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
Se você quiser os 10 últimos registros delimitados por NUL de myFile.txt
(mas isso não seria um arquivo de texto), será necessário converter o arquivo \n
para \0
antes de chamar, o tail
que significa que o arquivo terá que ser lido completamente:
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
Editar (desde que você alterou o tail
para tail -f
na sua pergunta):
O último acima, obviamente, não faz sentido tail -f
.
O xargs -d '\n'
deles irá funcionar, mas para os outros, você vai ter um problema buffering. Em:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tr
amortece sua saída quando não vai para um terminal (aqui, um tubo). IE, ele não escreverá nada até que tenha acumulado um buffer completo (algo como 8kiB) de dados para gravação. Quais meios myCmd
serão chamados em lotes.
Em um sistema GNU ou FreeBSD, você pode alterar o comportamento do buffer tr
com o stdbuf
comando:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2
tail -f myFile.txt | xargs -r0i -d '\n' myCmd "{}" "||" "||"
parece funcionar! Obrigado.-i
opção aceita um argumento opcional, portanto-i0
não funcionaria. Todos eles devem trabalhar,tail -f
exceto o último, mas cuidado com o fato de que, devido ao buffer, haverá um atraso antes dexargs
receber sua entradatr
. Você pode mudar isso executando emstdbuf -o0 tr '\n' '\0'
vez detr '\n' '\0'
.