Der Befehl sort ordnet Zeilen aus Dateien oder von der Standardeingabe — ein klassisches Coreutils-Werkzeug, das auf jedem Linux-System vorhanden ist. Was zunächst wie alphabetisches Sortieren wirkt, entpuppt sich bei genauerem Hinsehen als überraschend tief: Locales, numerische Modi, mehrteilige Sortierschlüssel, Versions-Sort und Stabilität spielen alle hinein. Wer sort und seine wichtigsten Schalter beherrscht, baut robustere Pipelines und vermeidet die typischen Datenverluste.

Was sort macht

sort liest Zeilen aus einer oder mehreren Dateien (oder von stdin) und gibt sie sortiert auf stdout aus. Die Voreinstellung ist alphabetisch aufsteigend, lokalisiert nach der aktiven LC_COLLATE-Locale. Mehrere Eingabedateien werden dabei nicht einzeln sortiert, sondern als ein gemeinsamer Strom betrachtet und gemerged-sortiert ausgegeben.

sort ist destruktiv im Sinne der Reihenfolge — die Originaldatei bleibt unverändert, solange du nicht explizit zurückschreibst. Für ein In-Place-Sortieren gibt es -o, das die Ausgabe sicher in eine Datei lenkt (auch wenn diese gleichzeitig Eingabe ist).

Bash Einfach sortieren
sort namen.txt
Output
Anna
Bernd
Clara
Dirk
Bash Mehrere Dateien gemeinsam sortieren
sort liste-a.txt liste-b.txt

Wichtige Optionen

sort bringt eine ganze Reihe von Schaltern mit, doch die folgenden tauchen in der Praxis fast immer auf. Wer diese Tabelle verinnerlicht, deckt 95 Prozent aller Sortieraufgaben ab.

OptionWirkungTypischer Einsatz
-nNumerisch (ganze Zahlen) sortierenZahlenkolonnen, Statistiken
-gGeneral-Numeric (auch E-Notation)Wissenschaftliche Daten
-hHuman-readable (1K, 2M, 3G)du -sh und Co.
-rReihenfolge umkehrenTop-N absteigend
-uDoppelte Zeilen entfernenErsatz für sort | uniq
-k N[,M]Sortierschlüssel auf SpaltenbereichTabellarische Daten
-t SEPTrennzeichen für -k setzenCSV (-t,), /etc/passwd (-t:)
-fGroß-/Kleinschreibung ignorierenNamenslisten
-VVersions-SortSoftware-Versionen, IPs
-RZufällige ReihenfolgeStichproben, Tests
-cPrüfen, ob bereits sortiert (Exit 0/1)Pipelines absichern
-mBereits sortierte Eingaben mergenEffizient ohne Re-Sort
-o FILEIn Datei schreiben (auch Quelle)Sicherer als >
-sStabil sortierenMehrstufige Sortierungen
-S SIZESpeicher-Buffer setzen (-S 1G)Sehr große Files
--parallel=NThreads steuernMulti-Core-Maschinen

Numerisch sortieren

Wer Zahlen mit der Default-Sortierung ordnet, bekommt überraschende Ergebnisse: 10 landet vor 2, weil zeichenweise verglichen wird. Drei numerische Modi lösen das Problem — jeder für andere Eingaben.

Bash Ganze Zahlen sortieren
printf '%s\n' 10 2 100 5 | sort -n
Output
2
5
10
100

-n versteht Vorzeichen, Tausender-Trenner (locale-abhängig) und Dezimalpunkte, aber keine Exponenten wie 1e3. Für solche Fälle gibt es -g (General-Numeric), das auf strtold basiert und auch 1.5e6, inf oder nan korrekt einordnet — dafür merklich langsamer ist.

-h ist die spezialisierteste Variante: Sie erkennt menschenlesbare Größen mit SI-Suffixen (K, M, G, T) und ist damit der Standardpartner für du -sh.

Bash Größen menschenlesbar sortieren
du -sh * | sort -h
Output
12K     notizen.md
4.2M    bilder
1.1G    videos

Nach Spalte sortieren mit -k

In tabellarischen Daten reicht eine reine Zeilensortierung nicht — gefragt ist die Sortierung nach einer bestimmten Spalte. Genau das leistet -k. Standardmäßig trennt sort Spalten an Whitespace-Übergängen, andere Trenner setzt -t.

Die Syntax -k N[,M] meint: Sortiere ab Spalte N bis Spalte M (jeweils einschließlich). Das ,M ist wichtig — -k2 allein bedeutet „ab Spalte 2 bis Zeilenende”, was bei mehreren Spalten oft nicht gewünscht ist.

Bash Nur nach Spalte 2 sortieren
sort -k2,2 mitarbeiter.txt
Output
003 Anna    Berlin
001 Bernd   Hamburg
002 Clara   Muenchen

Modifier wie n, r oder f lassen sich an jeden Key anhängen. So lässt sich pro Spalte ein eigenes Sortierverhalten definieren — ideal für mehrstufige Sortierungen.

Bash Erst nach Name, dann numerisch nach Alter
sort -k1,1 -k3,3n personen.txt

Bei CSV-Dateien wird das Komma zum Trenner — und Whitespace innerhalb von Werten bleibt korrekt:

Bash CSV nach dritter Spalte numerisch
sort -t, -k3,3n umsatz.csv

Auch /etc/passwd lässt sich elegant nach UID sortieren — Trenner ist hier der Doppelpunkt:

Bash /etc/passwd nach UID
sort -t: -k3,3n /etc/passwd

Locale-Effekte

Die Sortierreihenfolge hängt entscheidend von der aktiven Locale ab. Im Default-Setup eines deutschen Systems sortiert sort nach de_DE.UTF-8 — Umlaute werden „natürlich” einsortiert (Ä zwischen A und B), und Groß-/Kleinschreibung wird tendenziell ignoriert. Auf einem englischen System mit en_US.UTF-8 ist das Verhalten ähnlich, aber nicht identisch.

Die radikalste Alternative ist die C-Locale, oft auch als POSIX-Locale bezeichnet. Sie sortiert rein nach Byte-Werten — also der ASCII-Reihenfolge — und macht damit zwei Dinge: Sie wird schneller (oft um den Faktor 2 bis 10 bei großen Dateien), und sie wird vorhersehbar zwischen Systemen.

Bash Schnelle, deterministische Sortierung
LC_ALL=C sort große-datei.txt

-u Unique

Eine sehr häufige Aufgabe: Duplikate aus einer Liste entfernen. Die klassische Variante ist sort | uniq, aber sort -u macht beides in einem Schritt — und ist effizienter, weil keine zweite Pipe-Stufe nötig ist.

Bash Duplikate entfernen
sort -u einträge.txt
Output
Anna
Bernd
Clara

In Kombination mit -k arbeitet -u auf dem definierten Sortierschlüssel — Zeilen mit gleichem Schlüssel werden gleichgesetzt, auch wenn andere Spalten abweichen. Das ist sehr nützlich, kann aber überraschen: Bei sort -u -k2,2 bleibt von mehreren Zeilen mit gleichem Wert in Spalte 2 nur eine übrig — egal, was in den anderen Spalten steht.

Praxis-Pipelines

In freier Wildbahn taucht sort selten allein auf — fast immer ist es Teil einer Pipeline. Diese Muster begegnen einem im Linux-Alltag immer wieder.

Bash Top 5 größte Verzeichnisse
du -sh */ | sort -h | tail -5

du -sh liefert Verzeichnisgrößen im Human-Format, sort -h ordnet sie aufsteigend, tail -5 schneidet die fünf größten ab. Wer absteigend will, kombiniert sort -hr | head -5.

Bash Häufigkeits-Liste aus Logs
cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head
Output
4321 192.168.1.10
 982 192.168.1.42
 410 10.0.0.5

Der Klassiker: Eine Spalte extrahieren (cut), sortieren, Vorkommen zählen (uniq -c), nach Häufigkeit absteigend sortieren (sort -rn), die Top-Einträge zeigen (head). Funktioniert für IPs in Logs, Wörter in Texten, Statuscodes — überall, wo Häufigkeitsverteilungen interessant sind.

Bash IP-Adressen sortieren
sort -V ips.txt

-V (Versions-Sort) sortiert IP-Adressen korrekt, weil es Zahlen-Komponenten zwischen den Punkten erkennt. Ohne -V würde 192.168.1.10 vor 192.168.1.2 landen. Eine alternative Variante mit Spalten-Trick:

Bash IPs per Spalten-Trick
sort -t. -k1,1n -k2,2n -k3,3n -k4,4n ips.txt

Die Variante ohne -V zerlegt jede IP am Punkt in vier Spalten und sortiert jede einzeln numerisch. Nützlich auf älteren Systemen ohne -V-Support oder wenn die Eingabe gemischte Formate enthält und du explizit kontrollieren willst, wie verglichen wird.

Bash CSV nach Datum sortieren
sort -t, -k3,3 -k1,1 transaktionen.csv

Bei ISO-Datumsformaten (YYYY-MM-DD) reicht ein lexikalisches Sortieren — die Reihenfolge stimmt automatisch.

Stolperfallen

Locale ändert die Reihenfolge dramatisch

Was unter LC_ALL=C als Apfel, Aepfel, Zebra sortiert, kann unter de_DE.UTF-8 als Aepfel, Apfel, Zebra erscheinen — Umlaute werden „natürlich” einsortiert, Groß-/Kleinschreibung anders gewichtet. In Skripten, die auf reproduzierbare Reihenfolge angewiesen sind, immer explizit die Locale setzen: LC_ALL=C sort für ASCII-Reihenfolge oder eine konkrete Locale für lokalisierte Sortierung. Sonst hängen die Ergebnisse vom System ab, auf dem das Skript läuft.

-n und Komma-vs-Punkt bei Floats

-n respektiert die Locale beim Dezimaltrenner. Auf einem deutschen System ist 1,5 eine gültige Zahl, 1.5 dagegen nicht (oder umgekehrt). Werden Daten zwischen Systemen ausgetauscht, führt das zu falschen Sortierungen, ohne dass eine Fehlermeldung erscheint. Sicher ist LC_ALL=C sort -n mit Punkt als Dezimaltrenner, oder direkt -g, das toleranter mit beiden Varianten umgeht.

-k ist ein Keyrange, kein einzelnes Feld

-k2 bedeutet nicht „Spalte 2”, sondern „ab Spalte 2 bis Zeilenende”. Wer wirklich nur nach Spalte 2 sortieren will, schreibt -k2,2. Der Unterschied wird sichtbar, sobald mehrere Spalten existieren und die Default-Sortierung sonst auch Spalte 3, 4, 5 mitvergleicht — oft mit überraschenden Ergebnissen. Mehrteilige Sortierungen daher immer mit explizitem End-Index pro Key formulieren.

sort > file mit gleicher Quelle = Datenverlust

sort einträge.txt > einträge.txt klingt naheliegend, ist aber katastrophal: Die Shell legt die Ausgabe-Umleitung an, bevor sort die Eingabe öffnet — die Datei wird auf 0 Bytes gekürzt, und sort liest eine leere Datei. Lösung: sort -o einträge.txt einträge.txt. Der Schalter -o ist explizit dafür gebaut, dass Ein- und Ausgabedatei identisch sein dürfen.

sort allokiert RAM für den Buffer

Bei sehr großen Eingaben legt sort intern Buffer im Speicher an — und greift erst bei Überschreitung auf Temp-Dateien (/tmp) zurück. Standardmäßig nutzt es einen Bruchteil des verfügbaren Speichers. Mit -S 1G lässt sich der Buffer explizit setzen, mit —parallel=N die Thread-Anzahl. Wer Multi-GB-Files sortiert, sollte zusätzlich TMPDIR auf eine schnelle Disk legen, sonst wird /tmp zum Flaschenhals.

Stabil ist sort nur mit -s

Bei mehrfachem Sortieren („erst nach X, dann nach Y, ohne X zu zerstören”) ist Stabilität entscheidend: Zeilen mit gleichem Sortierschlüssel sollen ihre relative Reihenfolge behalten. GNU sort ist per Default nicht stabil — erst -s garantiert die Eingangsreihenfolge bei Gleichstand. Ohne -s kann sich die Reihenfolge zwischen Aufrufen ändern, abhängig vom internen Algorithmus und der Eingabegröße.

Versions-Sort ist nicht gleich numerisch

-V ist auf Software-Versionen optimiert: 1.2.10 kommt nach 1.2.9, v2.0-rc1 wird korrekt eingeordnet, gemischte Strings mit Buchstaben funktionieren. Das ist nicht dasselbe wie -n auf einer Spalte. Für Dateinamen mit Versionsnummern (backup-1.tar, backup-10.tar, backup-2.tar) ist -V die richtige Wahl, für reine Zahlenkolonnen -n.

Weiterführende Ressourcen

Externe Quellen

/ Weiter

Zurück zu Textverarbeitung

Zur Übersicht