Gibt es einen Befehl wie cat
unter Linux, der eine bestimmte Anzahl von Zeichen aus einer Datei zurückgeben kann?
zB habe ich eine Textdatei wie:
Hello world
this is the second line
this is the third line
Und ich möchte etwas, das die ersten 5 Zeichen zurückgibt, was "Hallo" wäre.
Vielen Dank
linux
command-line
pbreault
quelle
quelle
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo
verbraucht auch," world\n"
was für immer verloren ist.Antworten:
head
funktioniert auch:..wird die ersten 100 Bytes extrahieren und zurückgeben.
Das Schöne
head
daran ist, dass die Syntax fürtail
Übereinstimmungen:Sie können diese kombinieren, um Bytebereiche zu erhalten. Um beispielsweise die zweiten 100 Bytes aus einer Datei abzurufen, lesen Sie die ersten 200 mit
head
und verwenden Sie tail, um die letzten 100 abzurufen:quelle
head
und benutze danntail
, um die letzten 10 zu erhalten, zB:head -c 20 file | tail -c 10
Mit dd können Sie beliebige Byte-Blöcke extrahieren.
Beispielsweise,
würde die Bytes 1235 bis 1239 von seiner Eingabe in ihre Ausgabe kopieren und den Rest verwerfen.
Gehen Sie folgendermaßen vor, um nur die ersten fünf Bytes von der Standardeingabe zu erhalten:
Beachten Sie, dass dd, wenn Sie den Namen der Eingabedatei angeben möchten, über eine altmodische Argumentanalyse verfügt. Gehen Sie also folgendermaßen vor:
Beachten Sie auch, dass dd ausführlich verkündet, was es getan hat. Um dies wegzuwerfen, gehen Sie wie folgt vor:
oder
quelle
dd bs=1
dd gezwungen ist, jeweils ein einzelnes Zeichen zu lesen und zu schreiben, was viel langsamer ist alshead
bei einer großen Anzahl. Bei count = 5 fällt dies jedoch nicht auf.dd
anscheinend wird es den Trick tun. Prost!head -c
Implementierung desdd bs=5 count=1
Ansatzes funktioniertKopf :
Name
head - gibt den ersten Teil der Dateien aus
Zusammenfassung
Kopf [ OPTION ] ... [ DATEI ] ...
Beschreibung
Drucken Sie die ersten 10 Zeilen jeder DATEI in die Standardausgabe. Stellen Sie bei mehr als einer DATEI jeweils einen Header mit dem Dateinamen voran. Ohne DATEI oder wenn DATEI - ist, lesen Sie die Standardeingabe.
Obligatorische Argumente für lange Optionen sind auch für kurze Optionen obligatorisch.
-c , --bytes = [-] N gibt die ersten N Bytes jeder Datei aus; Drucken Sie mit dem führenden '-' alle bis auf die letzten N Bytes jeder Datei
quelle
Kopf oder Schwanz können es auch:
Druckt die ersten X Bytes (nicht unbedingt Zeichen, wenn es sich um eine UTF-16-Datei handelt) der Datei. tail macht dasselbe, mit Ausnahme der letzten X Bytes.
Diese (und geschnitten) sind tragbar.
quelle
Dieses Skript gibt die genaue Anzahl der Zeichen aus der jeweiligen Zeile und Position an, z.
gibt die Zeichen in Zeile 5 und die Zeichen 5 bis 8 von Zeile 5 an,
Hinweis : Mit
tail -1
dieser Option wird die letzte vom Kopf angezeigte Zeile ausgewählt.quelle
Sie können die Linie auch herausgreifen und dann wie folgt ausschneiden:
grep 'text' Dateiname | schneide -c 1-5
quelle
Ich weiß, die Antwort ist eine Antwort auf eine Frage, die vor 6 Jahren gestellt wurde ...
Aber ich habe ein paar Stunden nach etwas Ähnlichem gesucht und dann herausgefunden, dass: cut -c genau das tut, mit einem zusätzlichen Bonus, dass Sie auch einen Offset angeben können.
cut -c 1-5 gibt Hallo zurück und cut -c 7-11 gibt world zurück . Kein anderer Befehl erforderlich
quelle
Obwohl dies vor Jahren beantwortet / akzeptiert wurde, ist die derzeit akzeptierte Antwort nur für Codierungen mit einem Byte pro Zeichen wie iso-8859-1 oder für Einzelbyte-Teilmengen von Zeichensätzen mit variablem Byte (wie lateinische Zeichen) korrekt innerhalb von UTF-8). Selbst die Verwendung von Mehrbyte-Spleißen würde immer noch nur für Fest-Multibyte-Codierungen wie UTF-16 funktionieren. Angesichts der Tatsache, dass UTF-8 jetzt auf dem besten Weg ist, ein universeller Standard zu werden, und wenn man sich diese Liste der Sprachen nach Anzahl der Muttersprachler und diese Liste der 30 besten Sprachen nach Muttersprache / Sekundärverwendung ansieht , ist es wichtig, auf a hinzuweisen einfache, zeichenfreundliche (nicht bytebasierte) Technik mit variablen Bytes unter Verwendung von
cut -c
undtr
/sed
mit Zeichenklassen.Vergleichen Sie Folgendes, das aufgrund zweier häufiger lateinischer Fehler / Vermutungen in Bezug auf das Problem Bytes vs. Zeichen (eines ist
head
vs.cut
, das andere ist[a-z][A-Z]
vs.[:upper:][:lower:]
) doppelt fehlschlägt :auf diese (Anmerkung: diese hat gut funktioniert auf FreeBSD, aber sowohl
cut
&tr
auf GNU / Linux noch griechischen verstümmelt in UTF-8 für mich aber):Wenn Sie mit Variablen-Byte-Codierungen nicht richtig
cut
umgehen-c
, können Sie für "die erstenX
Zeichen" (durchX
Ihre Nummer ersetzen ) Folgendes versuchen:sed -E -e '1 s/^(.{X}).*$/\1/' -e q
- was jedoch auf die erste Zeile beschränkt isthead -n 1 | grep -E -o '^.{X}'
- Dies ist auf die erste Zeile beschränkt und verkettet jedoch zwei Befehledd
- was bereits in anderen Antworten vorgeschlagen wurde, aber wirklich umständlich istsed
Skript mit Schiebefensterpuffer zur Verarbeitung von Zeichen, die über mehrere Zeilen verteilt sind, aber das ist wahrscheinlich umständlicher / fragiler als nur die Verwendung von so etwasdd
Wenn Sie
tr
Zeichenklassen mit variablen Byte-Codierungen nicht korrekt verarbeiten, können Sie Folgendes versuchen:sed -E -e 's/[[:upper:]]/\L&/g
(GNU-spezifisch)quelle
printf 'Πού ' | cut -c 1
nur Kauderwelsch zurück ... es verhält sich wie 'Kopf'Hier ist ein einfaches Skript, das mit dem abschließt
dd
hier genannten Ansatz abgeschlossen wird:extract_chars.sh
quelle