Wenn du die letzten 10 Zeilen haben willst:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
Aber mit GNU xargs
können Sie den Begrenzer auch auf newline setzen mit:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0
ist die Abkürzung für -d '\0'
).
Portabel kann man auch einfach jedem Charakter entkommen:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
Oder zitiere jede Zeile:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
Wenn Sie die letzten 10 NUL-getrennten Datensätze von myFile.txt
(aber das wäre dann keine Textdatei) möchten, müssen Sie die in konvertieren \n
, \0
bevor Sie aufrufen, tail
was bedeuten würde, dass die Datei vollständig gelesen werden muss:
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
Bearbeiten (da Sie das geändert , tail
um tail -f
in Ihrer Frage):
Der letzte oben ergibt offensichtlich keinen Sinn tail -f
.
Das xargs -d '\n'
eine wird funktionieren, bei den anderen tritt jedoch ein Pufferungsproblem auf. Im:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tr
puffert seine Ausgabe, wenn es nicht zu einem Terminal geht (hier eine Pipe). IE wird es nichts schreiben, bis es einen Puffer voll (so etwas wie 8 kB) von Daten zum Schreiben angesammelt hat. Welche Mittel myCmd
werden in Chargen aufgerufen.
Auf einem GNU- oder FreeBSD-System können Sie das Pufferverhalten von tr
mit dem stdbuf
Befehl ändern :
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2
tail -f myFile.txt | xargs -r0i -d '\n' myCmd "{}" "||" "||"
scheint zu funktionieren! Vielen Dank.-i
Option akzeptiert ein optionales Argument,-i0
würde also nicht funktionieren. Sie sollten alle mittail -f
Ausnahme des letzten arbeiten, aber achten Sie darauf, dass es aufgrund der Pufferung eine Verzögerung geben wird, bevorxargs
die Eingabe von erfolgttr
. Sie können dies ändern, indem Siestdbuf -o0 tr '\n' '\0'
anstelle von ausführentr '\n' '\0'
.