Converter novas linhas em delimitadas por nulo ao usar tail

Converter novas linhas em delimitadas por nulo ao usar tail

Como posso alterar a saída de tailpara usar linhas terminadas em nulo em vez de novas linhas?

Minha pergunta é semelhante a esta:Como fazer `head` e `tail` na entrada delimitada por nulo no bash?, mas difere porque quero fazer algo como:

tail -f myFile.txt | xargs -i0 myCmd {} "arg1" "arg2"

Não estou usando finde portanto não posso usar-print0

Tudo isso para evitar o erro que ocorre no xargs:

xargs: unmatched double quote;
    by default quotes are special to xargs unless you use the -0 option

Responder1

Se você quiser as últimas 10 linhas:

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

Mas com GNU xargs, você também pode definir o delimitador como nova linha com:

tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2

( -0é a abreviação de -d '\0').

Portável, você também pode simplesmente escapar de cada personagem:

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 myFile.txt(mas isso não seria um arquivo de texto), você teria que convertê-los \npara \0antes de chamar, tailo que significaria que o arquivo teria que ser lido completamente:

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

Editar(já que você alterou tailpara tail -fna sua pergunta):

O último acima obviamente não faz sentido para tail -f.

Um xargs -d '\n'funcionará, mas para os outros você terá um problema de buffer. Em:

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

trarmazena sua saída quando ela não vai para um terminal (aqui, um pipe). Ou seja, ele não gravará nada até acumular um buffer cheio (algo como 8kiB) de dados para gravar. O que significa myCmdque será chamado em lotes.

Em um sistema GNU ou FreeBSD, você pode alterar o comportamento do buffer trcom o stdbufcomando:

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

informação relacionada