Ich habe eine Textdatei, die ich in eine Variable in meinem Shell-Skript ausgebe. Ich brauche aber nur die ersten 50 Zeichen.
Ich habe versucht, cat ${filename} cut -c1-50
aber ich bekomme weit mehr als die ersten 50 Zeichen? Das kann daran liegen, dass Sie cut
nach Zeilen suchen (nicht 100% sicher), während diese Textdatei eine lange Zeichenfolge sein kann - das hängt wirklich davon ab.
Gibt es ein Dienstprogramm, mit dem ich die ersten X-Zeichen eines cat
Befehls abrufen kann?
|
?cat ${filename} | cut -c1-50
Antworten:
Dies gibt die ersten 50 Bytes zurück.
Beachten Sie, dass der Befehl nicht immer auf allen Betriebssystemen gleich implementiert ist. Unter Linux und macOS verhält es sich so. Unter Solaris (11) müssen Sie die Gnu-Version in / usr / gnu / bin / verwenden.
quelle
-c
Option. Ich würde stattdessen für dd (1) gehen .GNU coreutils 5.97
).-c
als gültige Option definiert , sodass dies definitiv von Ihrer lokalen Umgebung abhängt. unix.com/man-page/posix/1/headIhr
cut
Befehl funktioniert, wenn Sie eine Pipe verwenden, um Daten an diese zu übergeben:Oder vermeiden Sie unnötigen Gebrauch von Katze und machen Sie sie ein bisschen sicherer:
Beachten Sie, dass die obigen Befehle die ersten 50 Zeichen (oder Bytes, abhängig von Ihrer
cut
Implementierung) jeder Eingabezeile ausgeben . Es sollte tun, was Sie erwarten, wenn Ihre Datei, wie Sie sagen, eine riesige Zeile ist.quelle
Dies gibt die ersten 50 Bytes zurück.
quelle
status=none
flagge. Verwenden Sie2>/dev/null
stattdessen (und zitieren Sie richtig):dd if="$filename" bs=1 count=50 2>/dev/null
(bs=50 count=1
Trotzdem sollten Sie in Betracht ziehen , die Anzahl der beteiligten Systemaufrufe zu verringern.)status=none
bei Verwendung von Ubuntu 14.04, Coreutils 8.21, aber2>/dev/null
wenn Sie eine frühere Version verwenden , sind Sie richtig .read()
von 50 Bytes. Wennfile
es sich beispielsweise um eine Pipe handelt und zu diesem Zeitpunkt weniger Zeichen verfügbar sind, werden weniger Bytes zurückgegeben. Um das Äquivalent von zu habenhead -c50
, müssten Sie GNU-spezifisch verwendeniflag=fullblock
.Die meisten bisherigen Antworten gehen davon aus, dass 1 Byte = 1 Zeichen ist. Dies ist möglicherweise nicht der Fall, wenn Sie ein Nicht-ASCII-Gebietsschema verwenden.
Ein etwas robusterer Weg dies zu tun:
Beachten Sie, dass dies voraussetzt:
ksh93
,bash
(oder einen aktuellenzsh
odermksh
(obwohl der einzige vonmksh
UTF-8 unterstützte Multibyte-Zeichensatz und nur danachset -o utf8-mode
)) und eine Versionhead
, die dies unterstützt-c
(die meisten tun dies heutzutage, aber nicht unbedingt als Standard).locale charmap
undfile -- "$filename"
überprüfen Sie dies). wenn nicht, setze es mit ie.LC_ALL=en_US.UTF-8
)head
, wobei ich von UTF-8 im schlimmsten Fall ausgegangen bin , bei dem alle Zeichen mit höchstens 4 Bytes codiert sind. Dies sollte die meisten Fälle abdecken, die mir einfallen.quelle
head
oder eine andere Implementierung voraus , die die-c
Option nōn-standard hinzufügt . Aber Sie benötigen bereits GNU-Bash. (Hinweis:mksh
Der UTF-8-Modus kann dies für UTF-8-codierte Dateien tun.) Ich würde das OP fragen, ob Oktetts oder Multibyte-Zeichen erforderlich sind.$filename
oder$testString
enthält keine leeren Zeilenumbrüche oder Platzhalter oder beginnt mit-
.${var:offset:length}
Konstrukt, das Sie hier verwenden, stammt tatsächlich vonksh93
und wird auch von neueren Versionen vonzsh
(zsh
hat ein eigenes$testString[1,50]
) unterstützt. Du brauchst${testString:0:50}
inksh93
undzsh
aber.Andere Variante (für die erste Zeile in der Datei)
quelle
read
undecho
? Oderbash expansion
?grep
(regexp), und ja, die Verwendung von Shell hier (Hinweis: Die erste Zeile kann groß sein). (Allerdings ist der Bashismus auch nicht in POSIX, aber die meisten Shells implementieren das.)1. Führen Sie für ASCII-Dateien die folgenden Schritte aus:
Gibt beispielsweise die ersten 50 Zeichen der Datei file.txt aus.
2. Verwenden
hexdump
Sie für Binärdaten, um sie als Hexadezimalzeichen auszudrucken:druckt beispielsweise die ersten 50 Bytes von file.bin aus.
Beachten Sie, dass ohne die
-v
Option verbosehexdump
wiederholte Zeilen durch ein Sternchen (*
) ersetzt werden. Siehe hier: https://superuser.com/questions/494245/what-does-an-asterisk-mean-in-hexdump-output/494613#494613 .quelle
Hierfür können Sie sed verwenden, um das Problem schnell zu lösen
quelle
sed -n -e '1s/^\(.\{50\}\).*/\1/p' ${filename}