it-swarm.com.de

Abrufen der ersten [x] Zeichen für eine Zeichenfolge aus einer Pipe

Wenn ich wirklich lange von einem Befehl ausgegeben habe (einzeilig), aber weiß, dass ich nur die ersten [x] (sagen wir 8) Zeichen der Ausgabe haben möchte, was ist der einfachste Weg, dies zu erreichen? Es gibt keine Begrenzer.

67
xenoterracide

Eine Möglichkeit ist die Verwendung von cut:

 command | cut -c1-8

Dadurch erhalten Sie die ersten 8 Zeichen jeder Ausgabezeile. Da cut Teil von POSIX ist, ist es wahrscheinlich auf den meisten Unices.

95
Steven D

Dies sind einige andere Möglichkeiten, um nur die ersten 8 Zeichen zu erhalten.

command | head -c8

command | awk '{print substr($0,1,8);exit}' 

command | sed 's/^\(........\).*/\1/;q'

Und wenn Sie Bash haben

var=$(command)
echo ${var:0:8}
26
user1606

Eine weitere Einzeilerlösung unter Verwendung der Parametererweiterung

echo ${Word:0:x}

EG: Word="Hello world"
echo ${Word:0:3} or echo ${Word::3} 
o/p: Hel


EG.2: Word="Hello world"
echo ${Word:1:3}
o/p: ell
2

Wenn Sie über eine ausreichend erweiterte Shell verfügen (z. B. funktioniert in Bash Folgendes, Sie sind sich nicht sicher, was Dash betrifft), können Sie Folgendes tun:

read -n8 -d$'\0' -r <(command)

Nach dem Ausführen von read ... <(command) befinden sich Ihre Zeichen in der Shell-Variablen REPLY. Geben Sie help read Ein, um weitere Optionen zu erfahren.

Erläuterung: Das Argument -n8 Für read besagt, dass wir bis zu 8 Zeichen möchten. Das -d$'\0' Sagt "Lesen bis zu einer Null" und nicht zu einer neuen Zeile. Auf diese Weise wird der Lesevorgang für 8 Zeichen fortgesetzt, auch wenn eines der früheren Zeichen eine neue Zeile ist (jedoch nicht, wenn es eine Null ist). Eine Alternative zu -n8 -d$'\0' Ist die Verwendung von -N8, Das genau 8 Zeichen lang liest oder bis der Standard EOF erreicht. Kein Begrenzer wird geehrt. Das passt wahrscheinlich besser zu Ihren Bedürfnissen, aber ich weiß nicht ohne weiteres, wie viele Muscheln einen Wert haben, der -N Im Gegensatz zu -n Und -d Ehrt. Fahren Sie mit der Erklärung fort: -r Sagt "Ignorieren" \ - Escapezeichen, sodass wir beispielsweise \\ Als zwei Zeichen und nicht als einzelnes \.

Schließlich führen wir read ... <(command) anstelle von command | read ... Aus, da in der zweiten Form der Lesevorgang in einer Unterschale ausgeführt wird, die dann sofort beendet wird und die gerade gelesenen Informationen verliert.

Eine andere Möglichkeit besteht darin, die gesamte Verarbeitung innerhalb der Subshell durchzuführen. Zum Beispiel:

$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
2
dubiousjim

Dies ist tragbar:

a="$(command)"             # Get the output of the command.
b="????"                   # as many ? as characters are needed.
echo ${a%"${a#${b}}"}      # select that many chars from $a

Um eine Zeichenfolge mit variabler Länge von Zeichen zu erstellen, muss hier eine eigene Frage .

1
user79743

Ich hatte dieses Problem beim manuellen Generieren von Prüfsummen-Dateien im Maven-Repository. Unglücklicherweise cut -c druckt immer eine neue Zeile am Ende der Ausgabe aus. Um das zu unterdrücken, benutze ich xxd:

command | xxd -l$BYTES | xxd -r

Es gibt genau $BYTES Bytes, es sei denn, die Ausgabe von command ist kürzer als genau diese Ausgabe.