Wenn ich wirklich lange Ausgaben von einem Befehl (einzelne Zeile) habe, aber ich weiß, dass ich nur die ersten [x] (sagen wir 8) Zeichen der Ausgabe haben möchte, wie kann ich das am einfachsten erreichen? Es gibt keine Begrenzer.
command-line
shell
text-processing
Xenoterracid
quelle
quelle
Antworten:
Ein Weg ist zu benutzen
cut
:Dies gibt Ihnen die ersten 8 Zeichen jeder Ausgabezeile. Da
cut
es Teil von POSIX ist, ist es wahrscheinlich auf den meisten Unices.quelle
cut -c
Zeichen ausgewählt werden.cut -b
oderhead -c
wählt Bytes aus. Dies macht in einigen Regionen einen Unterschied (in der Praxis bei Verwendung von UTF-8).cut -c-8
wählt zwischen 1 und 8.cut
das Äquivalent unter Windows?command | dd bs=8 count=1 2>/dev/null
. Das heißt nicht, dass es kürzer oder besser ist. Nur eine andere Alternative.cut
,cut -c
funktioniert wiecut -b
(das heißt, es funktioniert nicht richtig für Multi-Byte - Zeichen).Dies sind einige andere Möglichkeiten, um nur die ersten 8 Zeichen zu erhalten.
Und wenn Sie Bash haben
quelle
command | sed 's/\(.\{8\}\).*/\1/'
oder wenn Ihr unterstützt sie sed:command | sed -r 's/(.{8}).*/\1/'
; Andernfalls +1head -c
zählt Bytes , nicht Zeichen. In ähnlicher Weise behandelt unter den wichtigsten Awk-Implementierungen nur GNU awk Multibyte-Zeichen korrekt - FreeBSD Awk und Mawk nicht.Wenn Sie über eine ausreichend fortgeschrittene Shell verfügen (z. B. funktioniert Folgendes in Bash, wenn Sie sich nicht sicher sind, was das Bindestrich angeht), können Sie Folgendes tun:
Nach der Ausführung befinden
read ... <(command)
sich Ihre Zeichen in der Shell-VariablenREPLY
. Geben Sie einhelp read
, um weitere Optionen zu erfahren.Erklärung: Das
-n8
Argument zuread
besagt, dass wir bis zu 8 Zeichen wollen. Das-d$'\0'
sagt gelesen bis eine Null, anstatt 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 sich um eine Null handelt). Eine Alternative zu-n8 -d$'\0'
ist die Verwendung von-N8
, die genau 8 Zeichen liest oder bis das stdin EOF erreicht. Kein Trennzeichen wird berücksichtigt. Das wahrscheinlich passt besser auf Ihre Bedürfnisse, aber ich weiß nicht ohne Weiteres , wie viele Muscheln eine Lese haben, ehrt-N
im Gegensatz zu ehren-n
und-d
. Fahren Sie mit der Erklärung fort:-r
sagt ignore\
-escapes, so dass wir zum Beispiel\\
als zwei Zeichen und nicht als ein einzelnes behandeln\
.Schließlich tun wir dies
read ... <(command)
nicht,command | read ...
weil in der zweiten Form der Lesevorgang in einer Subshell ausgeführt wird, die dann sofort beendet wird und die gerade gelesenen Informationen verliert.Eine andere Möglichkeit besteht darin, die gesamte Verarbeitung in der Subshell durchzuführen. Zum Beispiel:
quelle
cut
.read -n <num>
; kleine Einschränkung: Bash 3.x (noch aktuell auf O) interpretiert fälschlicherweise<num>
als Byte - Zählung und somit nicht mit Multi-Byte - Zeichen; Dies wurde in Bash 4.x behoben.Eine weitere einzeilige Lösung mit Parametererweiterung
quelle
x=8; echo ${word:0:$x}
Anstatt die ganze Zahl fest zu codieren.Dies ist portabel:
Das Erstellen einer Zeichenfolge mit variabler Länge hat hier eine eigene Frage .
quelle
Ich hatte dieses Problem beim manuellen Generieren von Prüfsummendateien im Maven-Repository. Leider
cut -c
wird am Ende der Ausgabe immer eine neue Zeile ausgegeben. Um das zu unterdrücken, benutze ichxxd
:Es gibt genau
$BYTES
Bytes aus, es sei denn, diecommand
Ausgabe ist kürzer als die Ausgabe.quelle
cut
nachgestellte Newline zu entfernen, besteht darin, sie in| tr -d '\n'