
Wie kann ich die Ausgabe so ändern, tail
dass nullterminierte Zeilen anstelle von Zeilenumbrüchen verwendet werden?
Meine Frage ähnelt dieser:Wie macht man „head“ und „tail“ bei nullbegrenzten Eingaben in Bash?, unterscheidet sich aber darin, dass ich so etwas tun möchte wie:
tail -f myFile.txt | xargs -i0 myCmd {} "arg1" "arg2"
Ich verwende nicht find
und kann daher nicht verwenden-print0
All dies dient dazu, den in xargs auftretenden Fehler zu vermeiden:
xargs: unmatched double quote;
by default quotes are special to xargs unless you use the -0 option
Antwort1
Wenn Sie die letzten 10 Zeilen möchten:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
Mit GNU xargs
können Sie das Trennzeichen aber auch wie folgt auf eine neue Zeile setzen:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0
Kurzform für -d '\0'
).
Portabel können Sie auch einfach jedes Zeichen escapen:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
Oder zitieren Sie jede Zeile:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
Wenn Sie die letzten 10 NUL-getrennten Datensätze von möchten myFile.txt
(das wäre dann aber keine Textdatei), müssen Sie vor dem Aufruf \n
in konvertieren , was bedeuten würde, dass die Datei vollständig gelesen werden müsste:\0
tail
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
Bearbeiten(da Sie in Ihrer Frage das tail
„to“ geändert haben):tail -f
Der letzte Punkt oben macht offensichtlich keinen Sinn für tail -f
.
Das xargs -d '\n'
eine wird funktionieren, aber bei den anderen werden Sie ein Pufferproblem haben. In:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tr
puffert seine Ausgabe, wenn sie nicht an ein Terminal geht (hier eine Pipe). D. h., es wird nichts geschrieben, bis ein Puffer voll (etwa 8 KiB) an zu schreibenden Daten angesammelt ist. Das bedeutet, dass es myCmd
in Stapeln aufgerufen wird.
Auf einem GNU- oder FreeBSD-System können Sie das Pufferverhalten tr
mit dem folgenden stdbuf
Befehl ändern:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2