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).
sort namen.txtAnna
Bernd
Clara
Dirksort liste-a.txt liste-b.txtWichtige 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.
| Option | Wirkung | Typischer Einsatz |
|---|---|---|
-n | Numerisch (ganze Zahlen) sortieren | Zahlenkolonnen, Statistiken |
-g | General-Numeric (auch E-Notation) | Wissenschaftliche Daten |
-h | Human-readable (1K, 2M, 3G) | du -sh und Co. |
-r | Reihenfolge umkehren | Top-N absteigend |
-u | Doppelte Zeilen entfernen | Ersatz für sort | uniq |
-k N[,M] | Sortierschlüssel auf Spaltenbereich | Tabellarische Daten |
-t SEP | Trennzeichen für -k setzen | CSV (-t,), /etc/passwd (-t:) |
-f | Groß-/Kleinschreibung ignorieren | Namenslisten |
-V | Versions-Sort | Software-Versionen, IPs |
-R | Zufällige Reihenfolge | Stichproben, Tests |
-c | Prüfen, ob bereits sortiert (Exit 0/1) | Pipelines absichern |
-m | Bereits sortierte Eingaben mergen | Effizient ohne Re-Sort |
-o FILE | In Datei schreiben (auch Quelle) | Sicherer als > |
-s | Stabil sortieren | Mehrstufige Sortierungen |
-S SIZE | Speicher-Buffer setzen (-S 1G) | Sehr große Files |
--parallel=N | Threads steuern | Multi-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.
printf '%s\n' 10 2 100 5 | sort -n2
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.
du -sh * | sort -h12K notizen.md
4.2M bilder
1.1G videosNach 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.
sort -k2,2 mitarbeiter.txt003 Anna Berlin
001 Bernd Hamburg
002 Clara MuenchenModifier 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.
sort -k1,1 -k3,3n personen.txtBei CSV-Dateien wird das Komma zum Trenner — und Whitespace innerhalb von Werten bleibt korrekt:
sort -t, -k3,3n umsatz.csvAuch /etc/passwd lässt sich elegant nach UID sortieren — Trenner ist hier der Doppelpunkt:
sort -t: -k3,3n /etc/passwdLocale-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.
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.
sort -u einträge.txtAnna
Bernd
ClaraIn 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.
du -sh */ | sort -h | tail -5du -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.
cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head4321 192.168.1.10
982 192.168.1.42
410 10.0.0.5Der 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.
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:
sort -t. -k1,1n -k2,2n -k3,3n -k4,4n ips.txtDie 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.
sort -t, -k3,3 -k1,1 transaktionen.csvBei 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
- sort(1) – Manpage (man7.org) — Vollständige Optionsreferenz des GNU-
sort - GNU Coreutils: sort invocation — Detaillierte Erklärung aller Schalter mit Beispielen
- Arch Wiki: Core utilities — Übersicht über
sortund verwandte Coreutils - POSIX sort specification — Standard-Verhalten quer über Unix-Systeme
Verwandte Artikel
- uniq – Doppelte Zeilen filtern — Klassischer Partner in Pipelines
- cut – Spalten extrahieren — Häufiger Vorgänger von
sort - head – Erste Zeilen ausgeben — Top-N nach Sortierung
- awk – Datenstrom-Verarbeitung — Wenn
sort -kan seine Grenzen stößt - wc – Zeilen, Wörter, Bytes zählen — Häufigkeits-Pipelines mit
uniq -c