Linux Deutsch

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 verarbeiten und typische Fehler vermeiden.

cut ist ein Linux-Filter zum Auswählen fester Zeichenpositionen, Bytepositionen oder Felder aus jeder Eingabezeile. Die Quelldatei wird dabei nicht verändert: cut erzeugt lediglich eine gefilterte Ausgabe.

Typische Einsatzfälle sind einfache Listen, Protokolldateien, Tabulator- oder Doppelpunkt-getrennte Daten, die Datei /etc/passwd sowie die Weiterverarbeitung von Befehlsausgaben in einer Pipeline.

Grundsyntax und Arbeitsweise

Die allgemeine Form mit einer Datei lautet:

cut OPTIONEN DATEI

Ohne Dateinamen liest cut aus der Standardeingabe. Das kann eine Pipe, eine Umleitung oder auch eine direkte Eingabe im Terminal sein. Ein Bindestrich kann die Standardeingabe ausdrücklich als Dateiname kennzeichnen:

cut -d ':' -f 2 -

Für die Auswahl gibt es drei grundlegende Modi: -c für Zeichen, -b für Bytes und -f für Felder. Für einen klaren Einstieg sollte pro Aufruf jeweils nur eine dieser Auswahlarten verwendet werden.

Zeichen nach Position auswählen

Mit -c oder --characters wählst du Zeichenpositionen innerhalb jeder Zeile aus. Die Zählung beginnt bei 1, nicht bei 0.

cut -c 3 results.txt

Der Befehl gibt das dritte Zeichen jeder Zeile aus. Angenommen, results.txt enthält alpha, bravo und charlie, dann liefert die Auswahl jeweils das Zeichen an Position 3.

Einzelpositionen und Bereiche

Positionen können einzeln, als zusammenhängender Bereich oder als offener Bereich angegeben werden:

NotationBedeutungBeispiel
3Nur Position 3cut -c 3 datei
2,4,7Positionen 2, 4 und 7cut -c 2,4,7 datei
2-5Positionen 2 bis 5cut -c 2-5 datei
-4Position 1 bis 4cut -c -4 datei
5-Position 5 bis zum Zeilenendecut -c 5- datei
1-3,6Bereich 1 bis 3 und Position 6cut -c 1-3,6 datei

Mehrere Positionen und Bereiche werden durch Kommata kombiniert:

cut -c 1-4,8-10 results.txt

Die Ausgabe bewahrt die Reihenfolge der Zeichen in der Eingabezeile. Auch wenn die Auswahlliste unsortiert angegeben wird, werden die ausgewählten Zeichen in ihrer ursprünglichen Zeilenreihenfolge ausgegeben.

Bytes und Zeichen: -b gegenüber -c

Mit -b oder --bytes wählst du Bytepositionen statt sichtbarer Zeichen:

cut -b 1-8 daten.txt

Ein Byte ist eine Speichereinheit. Bei UTF-8 kann ein sichtbares Zeichen aus mehreren Bytes bestehen. Das betrifft beispielsweise Umlaute, Akzente und viele andere Unicode-Zeichen. Eine Byteauswahl kann deshalb mitten in einem Mehrbytezeichen enden und eine beschädigte Ausgabe erzeugen.

Für die Auswahl von Textpositionen ist -c bei UTF-8 in der Regel verständlicher und sicherer. Die Option -n wird zusammen mit -b von manchen Varianten unterstützt, um keine unvollständigen Mehrbytezeichen auszugeben:

cut -b -n 1-8 daten.txt

Prüfe die Unterstützung mit cut --help, denn Optionen und Multibyte-Verhalten können sich zwischen GNU- und BSD-Implementierungen unterscheiden.

Felder anhand eines Trennzeichens auswählen

Ein Feld ist ein Abschnitt einer Zeile zwischen zwei Trennzeichen. Mit -f oder --fields wählst du nummerierte Felder aus. Auch hier beginnt die Zählung bei 1.

Ohne -d nimmt cut einen Tabulator als Trennzeichen an. Für Tabulator-getrennte Daten reicht daher:

cut -f 1,3 daten.tsv

Mit -d oder --delimiter wird ein einzelnes alternatives Trennzeichen festgelegt, zum Beispiel :, /, ; oder ein Komma:

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

Dieser Befehl liest aus jeder Zeile der Datei /etc/passwd die Felder 1, 3 und 7: typischerweise Benutzername, numerische Benutzer-ID und Login-Shell.

Weitere Beispiele:

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

Hier wird das dritte Segment aus Schrägstrich-getrennten Pfaden ausgewählt. Die verwendete Datenstruktur muss konsistent sein: Wenn manche Zeilen ein anderes Trennzeichen oder eine andere Feldanordnung besitzen, ist die Ausgabe möglicherweise nicht sinnvoll.

Feldbereiche

Für Felder gilt dieselbe Schreibweise wie für Zeichenpositionen:

cut -d ':' -f 1-3 daten.txt
cut -d ':' -f 2,4-6 daten.txt
cut -d ':' -f 3- daten.txt

Zeilen ohne Trennzeichen

Bei einer Feldauswahl gibt cut Zeilen ohne das erwartete Trennzeichen standardmäßig vollständig aus. Das kann bei gemischten oder unvollständigen Datensätzen überraschend sein.

Mit -s oder --only-delimited werden solche Zeilen unterdrückt:

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

In diesem Beispiel erscheinen nur Zeilen, die tatsächlich mindestens ein Doppelpunkt-Trennzeichen enthalten.

Ausgabe-Trennzeichen ändern

Werden mehrere Felder ausgegeben, verwendet cut normalerweise das Eingabetrennzeichen erneut. Mit --output-delimiter lässt sich ein eigenes Zeichen oder eine eigene Zeichenfolge für die Ausgabe setzen.

cut -d ':' -f 1,3 --output-delimiter=',' daten.txt

Eine Doppelpunkt-getrennte Eingabe wird damit für die ausgewählten Felder in eine komma-getrennte Ausgabe umgewandelt. Für eine besser lesbare tabellarische Darstellung kann bei GNU-Shells ein Tabulator verwendet werden:

cut -d ':' -f 1,3,7 --output-delimiter=$'\t' /etc/passwd

Dateien und Pipes als Eingabe

Mit einer Datei liest cut direkt deren Zeilen:

cut -d '.' -f 2 dateien.txt

Das kann bei einer einfachen Liste von Dateinamenserweiterungen funktionieren. Bei Dateinamen mit mehreren Punkten muss die Datenstruktur jedoch ausdrücklich geprüft werden.

Über eine Pipe verarbeitet cut die Standardausgabe eines anderen Befehls:

printf '%s\n' 'eins:zwei:drei' | cut -d ':' -f 2

Die Ausgabe lautet zwei. In einer typischen Pipeline übernimmt jedes Werkzeug eine bestimmte Rolle:

  • grep filtert Zeilen nach Mustern.
  • cut wählt feste Zeichenpositionen oder einfache Felder.
  • sort sortiert Zeilen.
  • uniq entfernt aufeinanderfolgende Duplikate oder zählt sie.
  • tr ersetzt oder löscht einzelne Zeichen.
  • awk verarbeitet Spalten mit Bedingungen, Berechnungen und komplexerer Logik.
grep '^user' /etc/passwd | cut -d ':' -f 1,7 | sort

Wichtige Optionen

OptionLangformFunktionBeispiel
-c--charactersZeichenpositionen auswählencut -c 2-5 datei
-b--bytesBytepositionen auswählencut -b 1-8 datei
-f--fieldsFelder auswählencut -f 1,3 datei
-d--delimiterEin einzelnes Eingabe-Trennzeichen setzencut -d ':' -f 1 datei
-s--only-delimitedZeilen ohne Trennzeichen unterdrückencut -d ':' -s -f 1 datei
keine Kurzform--output-delimiterAusgabe-Trennzeichen setzen--output-delimiter=','
-nje nach VarianteBei Byteauswahl Mehrbytezeichen nicht unvollständig ausgebencut -b -n 1-8 datei
keine Kurzform--helpLokale Optionsübersicht anzeigencut --help
keine Kurzform--versionBei GNU cut die Programmversion anzeigencut --version

Grenzen von cut

cut eignet sich für einfache, zeilenbasierte Daten mit festen Zeichenpositionen oder einem eindeutig verwendeten Trennzeichen. Es ist jedoch kein vollständiger CSV-Parser.

  • Ein CSV-Feld mit einem eingebetteten Komma in Anführungszeichen wird nicht CSV-konform interpretiert.
  • Escape-Regeln und gequotete Felder werden nicht ausgewertet.
  • -d behandelt genau ein Trennzeichen. Mehrere aufeinanderfolgende Leerzeichen sind daher keine flexible Spaltentrennung; sie können leere Zwischenfelder erzeugen.

Für Whitespace-getrennte Spalten mit beliebig vielen Leerzeichen, reguläre Ausdrücke, Bedingungen oder Berechnungen ist awk oft geeigneter. Für robuste CSV-Verarbeitung solltest du ein CSV-spezifisches Werkzeug oder eine Skriptsprache mit CSV-Bibliothek verwenden.

WerkzeugGeeignet fürNicht ideal für
cutFeste Zeichenbereiche und einfach getrennte FelderGequotete CSV-Daten und komplexe Logik
awkWhitespace-Spalten, Bedingungen und BerechnungenKomplexe CSV-Sonderfälle ohne zusätzliche Parserlogik
CSV-Werkzeug oder SkriptspracheGequotete CSV-Dateien, Escape-Regeln und robuste VerarbeitungSehr einfache einmalige Positionsauswahl

Fehler suchen und beheben

Falsche Spalte oder ganze Zeile erscheint

Wahrscheinlich stimmt das Trennzeichen nicht oder die Zeile enthält es nicht. Unsichtbare Tabulatoren und Sonderzeichen kannst du beispielsweise mit cat -A oder sed -n 'l' untersuchen. Setze danach das korrekte Zeichen mit -d; für Tabulator-getrennte Daten verwende -f ohne -d. Bei gemischten Zeilen kann -s helfen.

Umlaute werden beschädigt

Das deutet häufig auf eine Byteauswahl mit -b innerhalb eines UTF-8-Mehrbytezeichens hin. Prüfe Kodierung und Locale mit file und locale. Für sichtbare Textpositionen ist -c meist die passende Wahl.

Leerzeichen ergeben falsche Felder

Mehrere aufeinanderfolgende Leerzeichen werden von cut als mehrere einzelne Trennzeichen behandelt. Prüfe die Rohzeilen und verwende für flexible Whitespace-Trennung meist awk oder normalisiere die Daten vorher.

CSV mit Anführungszeichen wird falsch zerlegt

cut -d ',' kennt keine CSV-Zitierregeln. Verwende bei Feldern wie "Muster, GmbH" einen CSV-Parser, beispielsweise ein passendes Python-Skript, csvkit oder ein anderes CSV-fähiges Werkzeug.

Positionen wirken um eins verschoben

cut zählt ab 1. Das erste Zeichen beziehungsweise Feld ist also Position 1. Vergleiche die Auswahl mit einer nummerierten Beispielzeile, bevor du die Pipeline weiterverwendest.

Option auf einem anderen Unix-System unbekannt

Zwischen GNU- und BSD-Varianten können Unterschiede bestehen. Nutze cut --help und man cut zur Prüfung. In portablen Shell-Skripten solltest du grundlegende Optionen bevorzugen oder Plattformabhängigkeiten dokumentieren.

Hilfe und nächste Schritte

Die lokale Dokumentation ist entscheidend, weil sie die tatsächlich installierte Variante beschreibt:

cut --help
cut --version
man cut

Für verwandte Aufgaben sind grep beziehungsweise andere Filterwerkzeuge, join zum Verbinden strukturierter Dateien und nl zum Nummerieren von Zeilen nützlich.

Merksätze

  • cut verändert Eingabedateien nicht, sondern erzeugt gefilterte Ausgabe.
  • Positionen und Felder beginnen bei 1.
  • -c steht für Zeichen, -b für Bytes und -f für Felder.
  • Ohne -d verwendet der Feldmodus Tabulatoren.
  • -s unterdrückt Zeilen ohne das erwartete Trennzeichen.
  • Für UTF-8-Text ist -c meist verständlicher als -b.
  • Für komplexes CSV oder flexible Whitespace-Spalten ist cut nicht das richtige Werkzeug.