Converte novas linhas para delimitadas por nulo ao usar a cauda

17

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

A minha pergunta é semelhante a esta: Como fazer 'head' e 'tail' na entrada delimitada por nulo no bash? , mas difere em que eu quero fazer algo como:

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

Eu não estou usando find e, portanto, não posso usar -print0

Tudo isso é para evitar o erro que ocorre nos xargs:

xargs: unmatched double quote;
    by default quotes are special to xargs unless you use the -0 option
    
por Lars 28.03.2014 / 09:59

1 resposta

24

Se você quiser as últimas 10 linhas:

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

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

tail myFile.txt | sed 's/./\&/g' | xargs -I{} myCmd {} arg1 arg2

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

Portavelmente, você também pode simplesmente escapar de todos os caracteres:

tail myFile.txt | sed 's/"/"\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2

Ou cite cada linha:

tr '\n
tail -f myFile.txt | tr '\n' '
tail -f myFile.txt | stdbuf -o0 tr '\n' '
tail myFile.txt | tr '\n' '
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
' | xargs -r0i myCmd {} arg1 arg2
' | xargs -r0i myCmd {} arg1 arg2
' | xargs -r0i myCmd {} arg1 arg2
' '
tail myFile.txt | sed 's/./\&/g' | xargs -I{} myCmd {} arg1 arg2
\n' < myFile.txt | tail | tr '\n
tail myFile.txt | sed 's/"/"\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
' '
tr '\n
tail -f myFile.txt | tr '\n' '
tail -f myFile.txt | stdbuf -o0 tr '\n' '%pre%' |
  xargs -r0i myCmd {} arg1 arg2
' | xargs -r0i myCmd {} arg1 arg2
' '%pre%\n' < myFile.txt | tail | tr '\n%pre%' '%pre%\n' | xargs -r0i myCmd {} arg1 arg2
\n' | xargs -r0i myCmd {} arg1 arg2

Se você deseja os 10 últimos registros delimitados por NUL de \n (mas não seria um arquivo de texto), é necessário converter o tail em tail antes de chamar tail -f , que significaria que o arquivo terá que ser lido completamente:

%pre%

Editar (desde que você alterou o tail -f para xargs -d '\n' em sua pergunta):

O último acima obviamente não faz sentido para tr .

O myCmd irá funcionar, mas para os outros, você terá um problema de buffering. Em:

%pre%

tr armazena sua saída quando não vai para um terminal (aqui, um pipe). I.E., ele não gravará nada até que tenha acumulado um buffer cheio (algo como 8kiB) de dados para gravar. O que significa que stdbuf será chamado em lotes.

Em um sistema GNU ou FreeBSD, você pode alterar o comportamento do buffer de %code% com o comando %code% :

%pre%     
por 28.03.2014 / 10:18