Konvertieren Sie Zeilenumbrüche in durch Nullen getrennte Zeilen, wenn Sie das Ende verwenden

Konvertieren Sie Zeilenumbrüche in durch Nullen getrennte Zeilen, wenn Sie das Ende verwenden

Wie kann ich die Ausgabe so ändern, taildass 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 findund 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 xargskönnen Sie das Trennzeichen aber auch wie folgt auf eine neue Zeile setzen:

tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2

( -0Kurzform 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 \nin konvertieren , was bedeuten würde, dass die Datei vollständig gelesen werden müsste:\0tail

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

trpuffert 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 myCmdin Stapeln aufgerufen wird.

Auf einem GNU- oder FreeBSD-System können Sie das Pufferverhalten trmit dem folgenden stdbufBefehl ändern:

tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
  xargs -r0i myCmd {} arg1 arg2

verwandte Informationen