Convierta nuevas líneas a delimitadas por nulos cuando use tail

Convierta nuevas líneas a delimitadas por nulos cuando use tail

¿Cómo puedo cambiar la salida tailpara 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 findy 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

( -0es 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 \na \0antes 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 taila tail -fen 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

tramortigua 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 myCmdque se llamará en lotes.

En un sistema GNU o FreeBSD, puede modificar el comportamiento del almacenamiento en búfer trcon el stdbufcomando:

tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
  xargs -r0i myCmd {} arg1 arg2

información relacionada