it-swarm.com.de

Erste X-Zeichen aus dem Befehl cat erhalten?

Ich habe eine Textdatei, die ich in meinem Shell-Skript an eine Variable ausgeben möchte. Ich brauche jedoch nur die ersten 50 Zeichen.

Ich habe versucht, cat ${filename} cut -c1-50 aber ich bekomme weit mehr als die ersten 50 Zeichen? Dies kann daran liegen, dass cut nach Zeilen sucht (nicht 100% sicher), während diese Textdatei eine lange Zeichenfolge sein kann - es kommt wirklich darauf an.

Gibt es da draußen ein Dienstprogramm, in das ich einleiten kann, um die ersten X-Zeichen aus einem cat -Befehl abzurufen?

51
jkj2000
head -c 50 file

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

71
DisplayName

Ihr Befehl cut funktioniert, wenn Sie eine Pipe verwenden, um Daten an ihn zu übergeben:

cat ${file} | cut -c1-50 

Oder vermeiden Sie einen nutzlosen Gebrauch von Katzen und machen Sie sie ein wenig sicherer:

cut -c1-50 < "$file"

Beachten Sie, dass die obigen Befehle die ersten 50 Zeichen (oder Bytes, abhängig von Ihrer Implementierung von cut) jeder Eingabezeile drucken. Es sollte das tun, was Sie erwarten, wenn Ihre Datei, wie Sie sagen, eine große Zeile ist.

31
terdon
dd status=none bs=1 count=50 if=${filename}

Dies gibt die ersten 50 Bytes zurück.

8
doneal24

Bei den meisten Antworten wird bisher davon ausgegangen, 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:

testString=$(head -c 200 < "${filename}") &&
  printf '%s\n' "${testString:0:50}"

Beachten Sie, dass dies Folgendes voraussetzt:

  1. Sie verwenden ksh93, bash (oder ein aktuelles zsh oder mksh (obwohl der einzige von mksh unterstützte Mehrbyte-Zeichensatz ist UTF-8 und erst nach set -o utf8-mode)) Und einer Version von head, die -c Unterstützt (die meisten tun dies heutzutage, aber nicht streng Standard).
  2. Das aktuelle Gebietsschema ist auf dieselbe Codierung wie die Datei eingestellt (geben Sie locale charmap Und file -- "$filename" Ein, um dies zu überprüfen). Wenn nicht, setzen Sie es mit dh. LC_ALL=en_US.UTF-8)
  3. Ich habe die ersten 200 Bytes der Datei mit head genommen, wobei ich von UTF-8 im schlimmsten Fall ausgegangen bin, bei dem alle Zeichen auf höchstens 4 Bytes codiert sind. Dies sollte die meisten Fälle abdecken, die mir einfallen.
5
Calimo
grep -om1 "^.\{50\}" ${filename}

Andere Variante (für die erste Zeile in der Datei)

(IFS= read -r line <${filename}; echo ${line:0:50})
2
Costas

1. Für ASCII -Dateien tun Sie wie @DisplayName sagt :

head -c 50 file.txt

druckt zum Beispiel die ersten 50 Zeichen von file.txt aus.

2. Verwenden Sie für Binärdaten hexdump, um sie als Hex-Zeichen auszudrucken:

hexdump -n 50 -v file.bin

druckt zum Beispiel die ersten 50 Bytes von file.bin aus.

Beachten Sie, dass ohne das -v ausführliche Option, hexdump würde wiederholte Zeilen durch ein Sternchen ersetzen (*) stattdessen. Siehe hier: https://superuser.com/questions/494245/what-does-an-asterisk-mean-in-hexdump-output/494613#49461 .

1
Gabriel Staples