VMware ESXi and vSphere Cluster Management
Dateien und Textspalten mit Linux sort sortieren
Lerne, wie du Linux-Dateien und Befehlsausgaben mit sort alphabetisch, numerisch, nach Spalten und Versionsnummern sortierst.
Der Linux-Befehl sort ordnet Zeilen aus Dateien oder aus der Standardeingabe. Die Standardausgabe ist das normale Ausgabeziel eines Kommandos, meistens das Terminal. Die Quelldatei bleibt dabei normalerweise unverändert.
Mit sort kannst du beispielsweise Namen alphabetisch ordnen, Textspalten vergleichen, Zahlen numerisch sortieren oder eine Befehlsausgabe in einer Pipeline weiterverarbeiten.
Grundsyntax und Zweck von sort
sort [Optionen] [Datei ...]
Ohne angegebene Datei liest sort aus der Standardeingabe. Dadurch kann die Ausgabe eines anderen Kommandos über eine Pipeline als Eingabe dienen:
printf '%s\n' Birne Apfel Kirsche | sort
Du kannst auch mehrere Dateien angeben. Ihre Zeilen werden gemeinsam gelesen und als eine sortierte Ausgabe ausgegeben:
sort januar.txt februar.txt
sort schreibt das Ergebnis standardmäßig auf die Standardausgabe. Es verändert die Eingabedateien nicht automatisch.
Alphabetische Standardsortierung
Angenommen, namen.txt enthält:
Clara
Anton
Beate
David
Die ursprüngliche Reihenfolge ist nicht alphabetisch. Mit folgendem Befehl wird jede Zeile lexikografisch sortiert:
sort namen.txt
Die Ausgabe lautet typischerweise:
Anton
Beate
Clara
David
Lexikografisch bedeutet, dass Text Zeichen für Zeichen nach der aktiven Zeichenreihenfolge verglichen wird. Die Ausgabe erscheint auf dem Terminal; namen.txt bleibt unverändert.
Umgekehrte Reihenfolge mit -r
Die Option -r kehrt die ermittelte Sortierreihenfolge um:
sort -r namen.txt
David
Clara
Beate
Anton
-r kann mit einem Sortierschlüssel und anderen Vergleichsarten kombiniert werden. Das folgende Beispiel sortiert nach dem zweiten Feld numerisch und gibt die Reihenfolge absteigend aus:
sort -k 2,2nr personen.txt
Nach Feldern oder Spalten sortieren
Eine Eingabezeile kann aus mehreren Feldern bestehen. Ein Feld ist ein Teil der Zeile, der durch Leerraum oder ein festgelegtes Trennzeichen abgegrenzt wird. Mit -k wählst du den Sortierschlüssel aus: Das ist das Feld oder der Feldbereich, dessen Inhalt die Reihenfolge bestimmt.
Die Feldnummerierung beginnt bei 1, nicht bei 0. Bei standardmäßig leerraumgetrennten Daten kann eine Datei so aussehen:
Clara Berlin
Anton Hamburg
Beate Köln
David Berlin
Nach dem zweiten Feld, also dem Ort, sortierst du so:
sort -k 2 personen.txt
Ein einzelnes Feld solltest du oft als Bereich mit identischem Anfang und Ende schreiben:
sort -k 2,2 personen.txt
-k 2 bezeichnet den Schlüssel ab Feld 2 bis zum Ende der Zeile, während -k 2,2 ausdrücklich nur Feld 2 verwendet. Die genaue Schlüsselbegrenzung macht Befehle verständlicher und verhindert unerwartete Vergleiche weiterer Textteile.
Mehrere Sortierschlüssel
Mehrere -k-Angaben werden in ihrer Reihenfolge ausgewertet. Zuerst wird der primäre Schlüssel verglichen. Bei Gleichstand entscheidet der nächste Schlüssel.
sort -k 2,2 -k 1,1 personen.txt
Hier wird zuerst nach Nachname beziehungsweise Feld 2 und bei gleichem Nachnamen nach Feld 1 sortiert. Optionen wie n gehören direkt an den jeweiligen Schlüssel:
sort -k 1,1 -k 2,2n artikel.txt
Damit kann beispielsweise zuerst nach einer Kategorie als Text und innerhalb jeder Kategorie nach einer Nummer sortiert werden.
Feldtrenner mit -t
Bei der Standardsortierung wird zusammenhängender Leerraum als Feldtrennung behandelt. Für andere Datenformate legst du mit -t ein einzelnes Trennzeichen fest.
Passwortdatei-ähnliche Daten verwenden häufig einen Doppelpunkt:
anna:x:1002:100:Anna Beispiel
berta:x:1001:100:Berta Beispiel
claus:x:1005:100:Claus Beispiel
Nach der dritten, numerischen Spalte sortierst du so:
sort -t ':' -k 3,3n konten.txt
Semikolongetrennte Daten werden entsprechend mit -t ';' verarbeitet:
sort -t ';' -k 2,2n messwerte.txt
Auch einfache CSV-ähnliche Zeilen können so behandelt werden:
sort -t ',' -k 2,2n daten.csv
Das ist jedoch nur für einfache Zeilen zuverlässig. CSV kann Anführungszeichen, eingebettete Kommas und Zeilenumbrüche enthalten. Für solche Dateien ist ein spezialisiertes CSV-Werkzeug zuverlässiger als sort, weil sort keine vollständige CSV-Syntax versteht.
Textuelle und numerische Sortierung
Ohne Option vergleicht sort Werte als Text. Deshalb kann eine Zahlenliste überraschend aussehen:
printf '%s\n' 2 10 100 | sort
10
100
2
Für Ganzzahlen verwendest du -n:
sort -n zahlen.txt
Mit einem numerischen Spaltenschlüssel wird die Option an den Schlüssel angehängt:
sort -k 2,2n werte.txt
Die Option -h versteht menschenlesbare Größen mit Einheiten wie K, M und G:
sort -h groessen.txt
Damit wird beispielsweise 900K vor 2M und 1G eingeordnet. Für Versionsangaben ist -V gedacht:
sort -V versionen.txt
Eine Versionssortierung ordnet etwa 1.9 vor 1.10, statt die Werte wie gewöhnlichen Text zu behandeln.
| Eingabewerte | Ungeeignete oder überraschende Standardsortierung | Passende Option | Erwartete fachliche Reihenfolge |
|---|---|---|---|
| Ganzzahlen | 10 vor 2 | -n | 2, 10, 100 |
| Menschenlesbare Dateigrößen | Einheiten werden als Text behandelt | -h | 900K, 2M, 1G |
| Versionsnummern | 1.10 kann vor 1.9 erscheinen | -V | 1.9, 1.10, 1.11 |
| Groß- und kleingeschriebene Wörter | Groß- und Kleinbuchstaben werden unterschiedlich verglichen | -f | Vergleich ohne Berücksichtigung der Großschreibung |
Wichtige Optionen von sort
| Option | Zweck | Typischer Einsatz |
|---|---|---|
-r | Umgekehrte Reihenfolge | Absteigende alphabetische oder numerische Ausgabe |
-k | Sortierschlüssel auswählen | -k 2,2 für Feld 2 |
-t | Eigenen Feldtrenner festlegen | -t ':' für Doppelpunktdaten |
-n | Numerisch vergleichen | Ganzzahlen und numerische Spalten |
-h | Menschenlesbare Größen vergleichen | K, M und G |
-V | Versionssortierung | Softwareversionen |
-c | Sortierreihenfolge prüfen und Abweichung melden | Validierung in Skripten |
-C | Sortierreihenfolge still prüfen | Nur den Exit-Status auswerten |
-u | Gleiche Einträge nur einmal ausgeben | Sortierendes Entfernen von Duplikaten |
-s | Stabile Sortierung erzwingen | Originalreihenfolge bei gleichen Schlüsseln bewahren |
-f | Groß- und Kleinschreibung beim Vergleich ignorieren | Namen unabhängig von Schreibweise ordnen |
-o | Ausgabe in eine Datei schreiben | Eingabedatei sicher durch sortierte Ausgabe ersetzen |
Sortierreihenfolge prüfen: -c und -C
Mit -c prüfst du, ob eine Datei bereits entsprechend den angegebenen Sortieroptionen geordnet ist:
sort -c -k 2,2n werte.txt
Ist die Reihenfolge korrekt, bleibt die Ausgabe normalerweise leer und der Exit-Status ist erfolgreich. Bei einer Abweichung meldet sort die erste fehlerhafte Stelle. Der Exit-Status ist der Rückgabewert eines Kommandos und kann in Shell-Skripten ausgewertet werden.
if sort -C -k 2,2n werte.txt; then
echo "Reihenfolge ist korrekt"
else
echo "Datei ist nicht korrekt sortiert"
fi
-C ist die stille Variante: Sie gibt keine Diagnose aus und liefert nur den passenden Exit-Status. Wichtig ist, beim Prüfen exakt dieselben Schlüssel-, Zahlen-, Trenner- und Locale-Optionen zu verwenden wie beim Erzeugen der Datei.
Ausgabe speichern und weiterverarbeiten
Mit der Standardausgabeumleitung > speicherst du das Ergebnis in einer neuen Datei:
sort daten.txt > daten-sortiert.txt
Auch Pipelines sind typisch:
journalctl -n 100 | sort | less
Verwende nicht einfach dieselbe Datei als Eingabe und Ziel einer Umleitung:
sort daten.txt > daten.txt
Die Shell öffnet und kürzt die Zieldatei, bevor sort sie vollständig lesen kann. Dadurch kann die Datei leer oder unvollständig werden.
Die Option -o lässt sort die Ausgabedatei selbst verwalten. Daher ist auch das Ersetzen der Eingabedatei möglich:
sort -o daten.txt daten.txt
Doppelte Zeilen und stabile Reihenfolge
-u sortiert und unterdrückt gleiche Einträge:
sort -u eintraege.txt
Ohne weitere Schlüsseloptionen bedeutet das: vollständig identische Zeilen werden zusammengefasst. Zeilen können jedoch unterschiedliche Inhalte haben und trotzdem denselben ausgewählten Schlüssel besitzen. Wenn du beispielsweise mit -k 2,2 sortierst, ist für -u die Vergleichsdefinition mit diesem Schlüssel relevant. Prüfe deshalb, ob du ganze Zeilen oder Schlüsselwerte eindeutig machen möchtest.
Bei gleichen Sortierschlüsseln kann eine stabile Sortierung wichtig sein. -s bewahrt die ursprüngliche Reihenfolge von Zeilen, deren Schlüssel gleich ist:
sort -s -k 2,2 personen.txt
Ohne -s können bei gleichem Hauptschlüssel weitere Teile der Zeile zur Auflösung des Gleichstands herangezogen werden.
Großschreibung, Zeichenreihenfolge und Locale
Eine Locale enthält umgebungsabhängige Sprach- und Sortierregeln. Sie beeinflusst unter anderem, wie Buchstaben, Sonderzeichen und Umlaute eingeordnet werden. Deshalb kann dieselbe Datei auf zwei Systemen unterschiedlich sortiert erscheinen.
Mit -f wird die Groß- und Kleinschreibung beim Vergleich ignoriert:
sort -f namen.txt
Für reproduzierbare technische Abläufe wird häufig die C-Locale verwendet:
LC_ALL=C sort daten.txt
LC_ALL=C führt zu einer definierten, byteorientierten Zeichenreihenfolge. Das ist für Skripte und Vergleichsdateien nützlich, wenn unabhängig von der Spracheinstellung immer dasselbe Ergebnis entstehen soll. Für eine benutzerfreundliche deutsche Sortierung solltest du dagegen bewusst die gewünschte Locale wählen. Sprachspezifika wie die Position von Ä, Ö und Ü können je nach Locale anders behandelt werden.
Beispiele für Sortierschlüssel
| Datenformat | Trennzeichen | Primärer Schlüssel | Sekundärer Schlüssel | Benötigte Optionen |
|---|---|---|---|---|
| Leerraumgetrennte Personendaten | Leerraum | Feld 2 | Feld 1 | -k 2,2 -k 1,1 |
| Doppelpunktgetrennte Kontodaten | : | Feld 3 numerisch | Feld 1 | -t ':' -k 3,3n -k 1,1 |
| Semikolongetrennte Messwerte | ; | Feld 2 numerisch | Feld 1 | -t ';' -k 2,2n -k 1,1 |
Typische Fehler beheben
Zahlen erscheinen als 1, 10, 2
Die Werte werden als Text verglichen. Verwende für den betreffenden Schlüssel -n, beispielsweise sort -k 1,1n zahlen.txt.
Die falsche Spalte wird verwendet
Prüfe den Feldtrenner und die Feldnummerierung ab 1. Bei festen Trennzeichen setze -t ausdrücklich. Bei Leerraum kann die tatsächliche Anzahl und Anordnung der Felder durch mehrere Leerzeichen oder Tabulatoren anders sein als erwartet.
Die Datei wird beim Sortieren in sich selbst leer
Die Ursache ist die Shell-Umleitung mit >. Schreibe in eine neue Datei oder verwende sort -o daten.txt daten.txt.
Umlaute oder Großbuchstaben stehen unerwartet
Prüfe die Locale und die Schreibweise. Für reproduzierbare technische Sortierung hilft LC_ALL=C; für einen Vergleich ohne Groß-/Kleinschreibung hilft -f.
Doppelte Zeilen bleiben scheinbar bestehen
Die gesamten Zeilen können verschieden sein, obwohl ein ausgewähltes Feld gleich ist. Entscheide, ob vollständige Zeilen oder nur Sortierschlüssel eindeutig sein sollen, und überprüfe die verwendete -k-Definition.
Versionsnummern sind falsch geordnet
Die Standardsortierung behandelt Punkte und Ziffern als normalen Text. Verwende sort -V versionen.txt.
sort -c meldet einen Fehler
Unsichtbare Leerzeichen, ein anderer Schlüssel, Großschreibung oder eine abweichende Locale können die Ursache sein. Untersuche die Datei, verwende beim Prüfen dieselben Optionen wie beim Sortieren und gleiche die Locale-Einstellungen ab.
Merksätze für die Praxis
sort dateisortiert Zeilen textuell aufsteigend und verändert die Quelle nicht.-rkehrt die Reihenfolge um,-kwählt Felder und-tlegt einen eigenen Trenner fest.- Für Zahlen, Größen und Versionen sind
-n,-hbeziehungsweise-Vdie passenden Vergleichsarten. -cdiagnostiziert eine falsche Reihenfolge,-Cprüft still über den Exit-Status.-uentfernt gleiche Vergleichsergebnisse;-sbewahrt bei gleichen Schlüsseln die Eingabereihenfolge.- Für Skripte kann
LC_ALL=Ceine reproduzierbare Zeichenreihenfolge sicherstellen.
Weitere Beispiele zu diesem Thema findest du unter sort mit Linux verwenden.