Si quieres esas últimas 10 líneas:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
Pero con GNU xargs
, también puede establecer el delimitador en nueva línea con:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0
es la abreviatura de -d '\0'
).
Portablemente, también puedes escapar de cada personaje:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
O cita cada línea:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
Si desea los 10 últimos registros delimitados por NUL de myFile.txt
(pero eso no sería un archivo de texto), tendría que convertir el archivo \n
a \0
antes de llamar, tail
lo que significaría que el archivo tendrá que leerse completamente:
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
Editar (ya que cambiaste tail
a tail -f
en tu pregunta):
El último de arriba obviamente no tiene sentido tail -f
.
El xargs -d '\n'
uno funcionará, pero para los otros, tendrá un problema de almacenamiento en búfer. En:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tr
almacena su salida cuando no va a una terminal (aquí, una tubería). Es decir, no escribirá nada hasta que haya acumulado un búfer lleno (algo así como 8 kB) de datos para escribir. Lo myCmd
que se llamará en lotes.
En un sistema GNU o FreeBSD, puede alterar el comportamiento de almacenamiento en búfer tr
con el 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! Gracias.-i
opción tiene un argumento opcional, por-i0
lo que no funcionaría. Todos deberían funcionar,tail -f
excepto el último, pero tenga en cuenta que debido al almacenamiento en búfer, habrá un retraso antes dexargs
obtener su entradatr
. Puede cambiar eso ejecutando enstdbuf -o0 tr '\n' '\0'
lugar detr '\n' '\0'
.