Si vous voulez que les 10 dernières lignes:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
Mais avec GNU xargs
, vous pouvez également définir le délimiteur sur newline avec:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0
est l'abréviation de -d '\0'
).
De manière portable, vous pouvez également simplement échapper à chaque personnage:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
Ou citez chaque ligne:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
Si vous voulez les 10 derniers enregistrements délimités par NUL myFile.txt
(mais ce ne serait pas un fichier texte), vous devez convertir le \n
en \0
avant d'appeler, tail
ce qui signifie que le fichier devra être lu en entier:
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
Modifier (puisque vous avez changé le tail
en tail -f
dans votre question):
Le dernier ci-dessus n'a évidemment aucun sens tail -f
.
L' xargs -d '\n'
un fonctionnera, mais pour les autres, vous aurez un problème de mise en mémoire tampon. Dans:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tr
met en mémoire tampon sa sortie lorsqu'il ne va pas à un terminal (ici, un tuyau). IE, il n'écrira rien tant qu'il n'aura pas accumulé un tampon plein (quelque chose comme 8 Ko) de données à écrire. Ce qui signifie myCmd
sera appelé par lots.
Sur un système GNU ou FreeBSD, vous pouvez modifier le comportement de mise en mémoire tampon de tr
avec la stdbuf
commande:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2
tail -f myFile.txt | xargs -r0i -d '\n' myCmd "{}" "||" "||"
semble fonctionner! Merci.-i
option prend un argument facultatif, donc-i0
ne fonctionnerait pas. Ils devraient tous fonctionner avectail -f
sauf le dernier, mais attention à cause de la mise en mémoire tampon, il y aura un délai avant d'xargs
obtenir son entréetr
. Vous pouvez changer cela en exécutantstdbuf -o0 tr '\n' '\0'
au lieu detr '\n' '\0'
.