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 '\ntail -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 '\ntail myFile.txt | sed 's/"/"\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
' 'tr '\ntail -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
em tail
tail
antes de chamar tail -f
, que significaria que o arquivo terá que ser lido completamente:
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:
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%