
Como posso alterar a saída de tail
para 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 find
e 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 \n
para \0
antes de chamar, tail
o 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 tail
para tail -f
na 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
tr
armazena 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 myCmd
que será chamado 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