![Convierta nuevas líneas a delimitadas por nulos cuando use tail](https://rvso.com/image/52119/Convierta%20nuevas%20l%C3%ADneas%20a%20delimitadas%20por%20nulos%20cuando%20use%20tail.png)
¿Cómo puedo cambiar la salida tail
para usar líneas terminadas en nulo en lugar de nuevas líneas?
Mi pregunta es similar a esta:¿Cómo hacer `head` y `tail` en entradas delimitadas por nulos en bash?, pero difiere en que quiero hacer algo como:
tail -f myFile.txt | xargs -i0 myCmd {} "arg1" "arg2"
No estoy usando find
y por eso no puedo usar-print0
Todo esto es para evitar el error que ocurre en xargs:
xargs: unmatched double quote;
by default quotes are special to xargs unless you use the -0 option
Respuesta1
Si quieres las últimas 10 líneas:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
Pero con GNU xargs
, también puedes configurar el delimitador como nueva línea con:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0
es la abreviatura de -d '\0'
).
De forma portátil, también puedes simplemente escapar de cada personaje:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
O cite cada línea:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
Si desea los 10 últimos registros delimitados por NUL myFile.txt
(pero entonces no sería un archivo de texto), deberá convertirlos \n
a \0
antes de llamar tail
, lo que significaría que el archivo deberá leerse en su totalidad:
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
.
Uno xargs -d '\n'
funcionará, pero para los demás tendrás un problema de almacenamiento en búfer. En:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tr
amortigua 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 kiB) de datos para escribir. Lo cual significa myCmd
que se llamará en lotes.
En un sistema GNU o FreeBSD, puede modificar el comportamiento del almacenamiento en búfer tr
con el stdbuf
comando:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2