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 DATEIOhne 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.txtDer 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:
| Notation | Bedeutung | Beispiel |
|---|---|---|
3 | Nur Position 3 | cut -c 3 datei |
2,4,7 | Positionen 2, 4 und 7 | cut -c 2,4,7 datei |
2-5 | Positionen 2 bis 5 | cut -c 2-5 datei |
-4 | Position 1 bis 4 | cut -c -4 datei |
5- | Position 5 bis zum Zeilenende | cut -c 5- datei |
1-3,6 | Bereich 1 bis 3 und Position 6 | cut -c 1-3,6 datei |
Mehrere Positionen und Bereiche werden durch Kommata kombiniert:
cut -c 1-4,8-10 results.txtDie 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.txtEin 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.txtPrü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.tsvMit -d oder --delimiter wird ein einzelnes alternatives Trennzeichen festgelegt, zum Beispiel :, /, ; oder ein Komma:
cut -d ':' -f 1,3,7 /etc/passwdDieser 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.txtHier 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.txtZeilen 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.txtIn 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.txtEine 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/passwdDateien und Pipes als Eingabe
Mit einer Datei liest cut direkt deren Zeilen:
cut -d '.' -f 2 dateien.txtDas 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 2Die Ausgabe lautet zwei. In einer typischen Pipeline übernimmt jedes Werkzeug eine bestimmte Rolle:
grepfiltert Zeilen nach Mustern.cutwählt feste Zeichenpositionen oder einfache Felder.sortsortiert Zeilen.uniqentfernt aufeinanderfolgende Duplikate oder zählt sie.trersetzt oder löscht einzelne Zeichen.awkverarbeitet Spalten mit Bedingungen, Berechnungen und komplexerer Logik.
grep '^user' /etc/passwd | cut -d ':' -f 1,7 | sortWichtige Optionen
| Option | Langform | Funktion | Beispiel |
|---|---|---|---|
-c | --characters | Zeichenpositionen auswählen | cut -c 2-5 datei |
-b | --bytes | Bytepositionen auswählen | cut -b 1-8 datei |
-f | --fields | Felder auswählen | cut -f 1,3 datei |
-d | --delimiter | Ein einzelnes Eingabe-Trennzeichen setzen | cut -d ':' -f 1 datei |
-s | --only-delimited | Zeilen ohne Trennzeichen unterdrücken | cut -d ':' -s -f 1 datei |
| keine Kurzform | --output-delimiter | Ausgabe-Trennzeichen setzen | --output-delimiter=',' |
-n | je nach Variante | Bei Byteauswahl Mehrbytezeichen nicht unvollständig ausgeben | cut -b -n 1-8 datei |
| keine Kurzform | --help | Lokale Optionsübersicht anzeigen | cut --help |
| keine Kurzform | --version | Bei GNU cut die Programmversion anzeigen | cut --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.
-dbehandelt 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.
| Werkzeug | Geeignet für | Nicht ideal für |
|---|---|---|
cut | Feste Zeichenbereiche und einfach getrennte Felder | Gequotete CSV-Daten und komplexe Logik |
awk | Whitespace-Spalten, Bedingungen und Berechnungen | Komplexe CSV-Sonderfälle ohne zusätzliche Parserlogik |
| CSV-Werkzeug oder Skriptsprache | Gequotete CSV-Dateien, Escape-Regeln und robuste Verarbeitung | Sehr 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 cutFür verwandte Aufgaben sind grep beziehungsweise andere Filterwerkzeuge, join zum Verbinden strukturierter Dateien und nl zum Nummerieren von Zeilen nützlich.
Merksätze
cutverändert Eingabedateien nicht, sondern erzeugt gefilterte Ausgabe.- Positionen und Felder beginnen bei 1.
-csteht für Zeichen,-bfür Bytes und-ffür Felder.- Ohne
-dverwendet der Feldmodus Tabulatoren. -sunterdrückt Zeilen ohne das erwartete Trennzeichen.- Für UTF-8-Text ist
-cmeist verständlicher als-b. - Für komplexes CSV oder flexible Whitespace-Spalten ist
cutnicht das richtige Werkzeug.