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
( -0est 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 \nen \0avant d'appeler, tailce 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 tailen tail -fdans 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
trmet 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 myCmdsera appelé par lots.
Sur un système GNU ou FreeBSD, vous pouvez modifier le comportement de mise en mémoire tampon de travec la stdbufcommande:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2