VMware ESXi and vSphere Cluster Management

Linux cut-Befehl: Zeichen und Felder aus Textzeilen auswählen

Lerne den Linux-Befehl cut kennen: Zeichen, Bytes und Felder auswählen, Trennzeichen verwenden, Pipes einsetzen und typische Fehler bei Textdateien vermeiden.

Der Linux-Befehl cut wählt aus jeder Eingabezeile bestimmte Zeichen, Bytes oder Felder aus. Er eignet sich besonders für einfache, zeilenbasierte Textdaten und Dateien, deren Inhalte durch ein einzelnes Trennzeichen gegliedert sind.

cut verändert die Quelldatei nicht. Die ausgewählten Daten werden normalerweise auf die Standardausgabe geschrieben, also im Terminal angezeigt oder an einen weiteren Befehl weitergereicht.

Was macht cut?

Eine Textzeile kann entweder aus festen Zeichenpositionen oder aus Feldern bestehen. Bei festen Positionen ist beispielsweise immer das dritte Zeichen interessant. Bei Feldern wird eine Zeile an einem Trennzeichen geteilt, etwa an einem Doppelpunkt oder Tabulator.

Beispielzeile:

admin:x:1000:1000:Administrator:/home/admin:/bin/bash

Mit -f und dem Trennzeichen : kann daraus beispielsweise das erste und siebte Feld ausgewählt werden. Das Ergebnis lautet dann admin:/bin/bash.

Grundsyntax und Eingabequellen

Die allgemeine Syntax lautet:

cut OPTIONEN DATEI

Eine Auswahloption für Zeichen, Bytes oder Felder ist erforderlich. Eine Datei liest cut direkt aus dem Dateinamen:

cut -c 3 results.txt

Alternativ verarbeitet cut Daten aus der Standardeingabe. Das geschieht entweder durch eine Pipe oder durch eine Eingabeumleitung:

grep 'status=ok' protokoll.txt | cut -d ' ' -f 1
cut -f 1 < daten.tsv

Bei einer Pipe wird die Ausgabe von grep zur Eingabe von cut. Die Quelldatei bleibt auch bei solchen Kombinationen unverändert.

Zentrale Optionen von cut

OptionZweckBeispielhafte AngabeHinweis
-cZeichenpositionen auswählen-c 2-6Positionen beginnen bei 1
-bBytepositionen auswählen-b 1-4Bei Mehrbyte-Zeichen besonders beachten
-fFelder auswählen-f 1,3Standardtrennzeichen ist der Tabulator
-dEin einzelnes Feldtrennzeichen festlegen-d ':'Wird normalerweise mit -f kombiniert
-sZeilen ohne Trennzeichen unterdrücken-sNur bei uneinheitlichen Felddaten relevant

Zeichenpositionen mit -c auswählen

Die Option -c steht für die Auswahl von Zeichenpositionen. Die Zählung beginnt bei 1, nicht bei 0.

Ein einzelnes Zeichen

Der folgende Befehl gibt aus jeder Zeile von results.txt das dritte Zeichen aus:

cut -c 3 results.txt

Enthält eine Zeile weniger als drei Zeichen, wird nur der vorhandene passende Bereich ausgegeben.

Mehrere einzelne Positionen

Eine durch Kommas getrennte Liste wählt mehrere Positionen aus:

cut -c 1,3,5 results.txt

Aus jeder Zeile werden das erste, dritte und fünfte Zeichen in der angegebenen Reihenfolge des Bereichs ausgegeben. Die Ausgabe enthält keine zusätzlichen Trennzeichen zwischen den ausgewählten Zeichen.

Zusammenhängende Bereiche

Mit einem Bindestrich wird ein Bereich angegeben:

cut -c 2-6 results.txt

Das Ergebnis enthält die Zeichen an den Positionen 2 bis einschließlich 6.

Bereiche können auch am Anfang oder Ende offen sein:

cut -c -4 results.txt
cut -c 5- results.txt
  • -4 bedeutet: vom Zeilenanfang bis einschließlich Position 4.
  • 5- bedeutet: ab Position 5 bis zum Zeilenende.

Auswahllisten und Bereiche

NotationBedeutungBeispielAusgewählte Positionen oder Felder
NEine einzelne Position3Position 3
N,MMehrere einzelne Positionen1,4Positionen 1 und 4
N-MGeschlossener Bereich2-5Positionen 2, 3, 4 und 5
-MVom Anfang bis M-4Positionen 1 bis 4
N-Ab N bis zum Ende5-Position 5 bis zum Zeilenende

Felder mit -f auswählen

Ein Feld ist ein Abschnitt einer Zeile zwischen zwei Trennzeichen. Die Option -f wählt Feldnummern aus. Auch bei Feldern beginnt die Zählung bei 1.

Ohne weitere Angabe verwendet cut den Tabulator als Feldtrennzeichen. Eine tabulatorgetrennte Datei wird häufig als TSV-Datei bezeichnet:

cut -f 1,3 daten.tsv

Der Befehl gibt aus jeder Zeile das erste und dritte Feld aus. Bei mehreren ausgewählten Feldern wird das Feldtrennzeichen zwischen den Ausgabefeldern beibehalten. Bei einer TSV-Datei sind das also Tabulatoren.

Einzelne Felder, Listen und Bereiche funktionieren analog zu Zeichenpositionen:

cut -f 2 daten.tsv
cut -f 1,3 daten.tsv
cut -f 2-4 daten.tsv
cut -f -3 daten.tsv
cut -f 4- daten.tsv

Benutzerdefinierte Trennzeichen mit -d

Mit -d wird ein anderes Trennzeichen festgelegt. Die Option erwartet genau ein einzelnes Zeichen und wird normalerweise zusammen mit -f verwendet.

Kolongetrennte Dateien

Die Datei /etc/passwd enthält mehrere durch Doppelpunkte getrennte Felder. Mit folgendem Befehl werden der Benutzername und die Login-Shell ausgegeben:

cut -d ':' -f 1,7 /etc/passwd

Das erste Feld ist typischerweise der Benutzername. Das siebte Feld enthält die Login-Shell, beispielsweise /bin/bash. Die genaue Feldbedeutung folgt dem Format der jeweiligen Datei.

Komma, Semikolon und Schrägstrich

Für einfache, einzeichengetrennte Daten können typische Separatoren angegeben werden:

cut -d ',' -f 2 daten.txt
cut -d ';' -f 1,3 daten.txt
cut -d '/' -f 3 results.txt

Bei einer Datei mit Zeilen im Muster bereich/gruppe/wert gibt der letzte Befehl das dritte Feld aus:

bereich/gruppe/wert
alpha/team42/aktiv

Die Ausgabe lautet:

wert
aktiv

Zeilen ohne Trennzeichen

Bei der Feldauswahl behandelt cut eine Zeile ohne das erwartete Trennzeichen standardmäßig als Zeile ohne Feldaufteilung und gibt sie unverändert aus. Das kann bei uneinheitlichen oder fehlerhaften Eingabedaten überraschend sein.

Mit -s werden solche Zeilen unterdrückt:

cut -d ';' -f 2 -s daten.txt

Dieser Befehl gibt nur das zweite Feld von Zeilen aus, die tatsächlich ein Semikolon enthalten. Ob -s sinnvoll ist, hängt vom Ziel ab: Für eine strenge Datenprüfung ist das Weglassen unvollständiger Zeilen oft hilfreich; für eine Untersuchung aller Eingabezeilen kann das Standardverhalten besser sein.

Praxisbeispiele mit Linux-Dateien und Pipes

Ausgewählte Spalten einer TSV-Datei weiterverarbeiten

Bei tabulatorgetrennten Daten kann cut zuerst relevante Spalten auswählen. Danach können weitere Befehle die Werte sortieren oder zählen:

cut -f 2 daten.tsv | sort | uniq

sort ordnet die Werte, und uniq entfernt direkt aufeinanderfolgende Duplikate. Für eine vollständige Häufigkeitsauswertung wird meist vorher sortiert.

Zeilen filtern und anschließend ein Feld auswählen

grep 'status=ok' protokoll.txt | cut -d ' ' -f 1

Hier filtert grep zunächst Zeilen. Danach nimmt cut das erste Feld, wobei ein einzelnes Leerzeichen als Trennzeichen angenommen wird. Bei variabler Anzahl von Leerzeichen ist diese Methode häufig nicht ausreichend.

Feldbereiche aus Pfadangaben

Für einfache schrägstrichgetrennte Angaben kann ein bestimmter Abschnitt extrahiert werden:

cut -d '/' -f 3 pfade.txt

Beachte, dass ein Pfad wie /var/log/system.log mit einem führenden Schrägstrich beginnt. Dadurch kann das erste Feld leer sein. Die Feldnummern müssen zur tatsächlichen Struktur der Zeile passen.

Wann ist cut geeignet?

DatenformGeeignetes VorgehenBegründung oder Einschränkung
Feste Zeichenpositionencut -cGeeignet, wenn jede Zeile gleich aufgebaut ist
Tabulatorgetrennte Datencut -fDer Tabulator ist das Standardtrennzeichen
Einfach einzeichengetrennte Datencut -d ZEICHEN -fGeeignet, wenn das Format keine komplexen Regeln benötigt
CSV mit AnführungszeichenCSV-fähiges Werkzeugcut kennt keine Quoting-Regeln oder eingebetteten Kommas
JSON oder verschachtelte DatenJSON-Werkzeug oder spezieller ParserDie Struktur ist nicht zuverlässig mit einfachen Feldern abbildbar

Zeichenpositionen, Bytes und Mehrbyte-Zeichen

-c wählt Zeichenpositionen aus, während -b Bytepositionen auswählt:

cut -c 1-4 datei.txt
cut -b 1-4 datei.txt

Ein Byte ist eine Einheit der zugrunde liegenden Kodierung. In UTF-8 können Zeichen wie Umlaute oder viele andere Unicode-Zeichen aus mehreren Bytes bestehen. Deshalb können Bytepositionen und Zeichenpositionen voneinander abweichen.

Bei ASCII-Text fallen beide Sichtweisen meist zusammen. Bei Mehrbyte-Zeichen solltest du die Kodierung und die Locale-Einstellung prüfen. Wenn die Verarbeitung Unicode-sensitiv sein muss, ist ein Werkzeug mit klarer Unterstützung für die gewünschte Zeichenkodierung oft besser geeignet.

Wichtige Einschränkungen

  • -d ist für ein einzelnes Zeichen vorgesehen. Mehrzeichenige Separatoren oder reguläre Ausdrücke können damit nicht direkt beschrieben werden.
  • Mehrere Leerzeichen werden nicht automatisch zu einem Separator zusammengefasst. cut -d ' ' behandelt jedes einzelne Leerzeichen als Trennzeichen.
  • CSV-Regeln wie Anführungszeichen, Kommas innerhalb eines Feldes oder maskierte Anführungszeichen werden nicht ausgewertet.
  • Für reguläre Ausdrücke, variable Leerraumtrennung und komplexere Feldlogik ist awk meist passender.
  • sed eignet sich für textbasierte Transformationen, spezialisierte CSV-Werkzeuge für korrektes CSV und JSON-Werkzeuge für verschachtelte Daten.

Fehlerbehebung

Die erwartete Spalte erscheint nicht

Prüfe zunächst das tatsächliche Trennzeichen. Eine Datei kann statt Tabulatoren auch Leerzeichen, Kommas, Semikolons oder ein anderes Zeichen enthalten. Bei einem einzelnen Separator setzt du -d passend:

cut -d ';' -f 2 daten.txt

Unsichtbare Tabulatoren und Leerzeichen lassen sich beispielsweise mit geeigneten Anzeigeoptionen von Textwerkzeugen untersuchen.

Mehrere Leerzeichen führen zu verschobenen Ergebnissen

cut fasst wiederholte Leerzeichen nicht automatisch zusammen. Bei variabler Whitespace-Trennung ist awk in der Regel geeigneter, weil es solche Zwischenräume flexibler behandeln kann.

Zeilen ohne Separator werden ausgegeben

Das ist das Standardverhalten bei der Feldauswahl. Verwende -s, wenn Zeilen ohne das erwartete Trennzeichen ausgeschlossen werden sollen:

cut -d ':' -f 1 -s datei.txt

Umlaute werden unerwartet ausgewählt

Die Ursache kann ein Unterschied zwischen Byte- und Zeichenbehandlung, eine ungeeignete Locale oder eine andere Dateikodierung sein. Prüfe die Kodierung und die Locale. Für Unicode-sensitive Verarbeitung solltest du ein dafür geeignetes Werkzeug einsetzen.

CSV wird falsch zerlegt

Bei CSV-Daten mit Anführungszeichen interpretiert cut jedes Komma als Feldgrenze. Ein Wert wie "Berlin, Deutschland" enthält jedoch ein Komma innerhalb eines Feldes. Verwende dafür einen CSV-Parser oder ein CSV-fähiges Kommandozeilenwerkzeug.

Fehlende oder ungültige Listenangabe

Eine Auswahloption und eine gültige Liste sind erforderlich. Beispiele für gültige Listen sind 3, 1,4, 2-5, -4 und 5-. Bei abweichendem Verhalten hilft die lokale Manpage mit man cut.

Prüfungsrelevante Merksätze

  • cut wählt Teile jeder Eingabezeile aus und verändert die Quelldatei nicht.
  • -c steht für Zeichenpositionen, -b für Bytepositionen und -f für Felder.
  • Positionen und Felder werden ab 1 gezählt.
  • Das Standardtrennzeichen bei -f ist der Tabulator.
  • -d legt genau ein Feldtrennzeichen fest und wird normalerweise mit -f kombiniert.
  • -s unterdrückt Zeilen ohne das angegebene Trennzeichen.
  • Für komplexe CSV-, JSON- oder reguläre Ausdruckslogik ist cut nicht das richtige Werkzeug.

Kurzreferenz

cut -c 3 results.txt
cut -c 1,3,5 results.txt
cut -c 2-6 results.txt
cut -c -4 results.txt
cut -c 5- results.txt
cut -f 1,3 daten.tsv
cut -d ':' -f 1,7 /etc/passwd
cut -d '/' -f 3 results.txt
cut -d ';' -f 2 -s daten.txt

Wenn du nur feste Zeichenpositionen oder einfache, einzeichengetrennte Felder aus zeilenbasierten Daten benötigst, ist cut ein schnelles und übersichtliches Werkzeug. Für weitergehende Verarbeitung kannst du es über eine Pipe mit anderen Linux-Befehlen kombinieren.