Ordnung ist das halbe Leben, auch auf der Kommandozeile. Mit dem Tool “sort” ordnen Sie Dateilisten und Programmausgaben. Wer will, fügt mit Hilfe dieses kleinen aber feinen Programms sogar mehrere Dateien sortiert zusammen.
Zu Befehl
Auch wenn sich viele Dinge bequem über grafische Oberflächen wie KDE oder GNOME regeln lassen – wer sein Linux-System richtig ausreizen möchte, kommt um die Kommandozeile nicht herum. Abgesehen davon gibt es auch sonst viele Situationen, in denen es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.
Der Name ist Programm: Mit dem Kommando sort sortieren Sie zeilenweise. Dabei bearbeitet das Kommando entweder angegebene Dateien oder liest aus der Standardeingabe. Nach welchen Kriterien sortiert wird, bestimmen Sie selbst – sort kennt viele Parameter, die eine gute Feinabstimmung ermöglichen.
Erste Sortierübungen
Eine Datei, die sich prima für Sortierübungen eignet, ist . Werfen Sie einen Blick hinein, sehen Sie, dass die einzelnen Zeilen jeweils bestimmte Felder enthalten, z. B.:
huhn:x:506:100:Heike Jurzik:/home/huhn:/bin/bash
Die einzelnen Felder sind jeweils durch Doppelpunkte voneinander abgetrennt und enthalten den Benutzernamen (huhn), das Passwort (x bedeutet, das Passwort steht in /etc/shadow), die User Identification Number (UID, für “normale” Benutzer eine Zahl ab 100), die Group Identification Number (GID), weitere Informationen (wie Name und Telefonnummer des Benutzers usw.), das Home-Verzeichnis des Benutzers und die Standard-Shell.
Um zu überprüfen, ob die Datei bereits sortiert ist, rufen Sie sort mit dem Parameter -c auf:
$ sort -c /etc/passwd sort: /etc/passwd:2: ungeordnet: bin:x:1:1:bin:/bin:/bin/bash
Die Ausgabe verrät: Die Datei ist nicht sortiert – schon in der zweiten Zeile befindet sich ein ungeordneter Eintrag. Wollen Sie die Passwortdatei sortieren, lassen Sie sort (zunächst ohne weitere Parameter) darauf los. Wenn Sie die Ausgabe nicht umleiten, landet sie im Terminal. Alternativ verwenden Sie den Operator > und geben einen Dateinamen an:
sort /etc/passwd > passwd_sort
Mit dem Größerzeichen überschreiben Sie die Datei passwd_sort, falls es sie schon gibt. Wollen Sie das verhindern, setzen Sie den Operator >> ein: Er hängt die Ausgabe an das Ende der Datei an.
Die Ausgabe des ersten Sortierversuchs zeigt: sort hat (ausgehend vom ersten Feld, also dem Benutzernamen) die Datei alphabetisch sortiert (Abbildung 1) und listet nun den “Pseudonutzer” at zuerst auf. Um die Reihenfolge umzukehren, setzen Sie die Option -r ein – dann taucht der Eintrag wwwrun am Anfang der Liste auf. Sortieren Sie Dateien, die doppelte Einträge enthalten, unterdrücken Sie die Ausgabe identischer Zeilen mit dem Parameter -u (“unique”, einmalig).
Spalten
Sofern nicht anders angegeben, untersucht sort ganze Zeilen und beginnt – wie im ersten Beispiel schön zu sehen – mit dem ersten Buchstaben. Mit ein paar Tricks überreden Sie das Kommando, anhand einer bestimmten Spalte zu sortieren. Standardmäßig sucht sort dabei nach Leerzeichen zwischen den Einträgen und interpretiert diese als Spaltengrenzen. Um dieses Verhalten besser zu verdeutlichen, stellen Sie sich eine fiktive Passwortdatei mit folgendem Aufbau vor:
… peggy x 502 100 Peggy Gans /home/peggy /bin/bash huhn x 506 100 Heike Jurzik /home/huhn /bin/bash petronella x 507 100 Petronella Huhn /home/petronella /bin/bash …
Um diese Liste jetzt nach der UID (also der dritten Spalte) zu sortieren, verwenden Sie den Parameter -k und geben als weitere Option die Nummer der Spalte an:
$ sort -k 3 /etc/passwd root x 0 0 root /root /bin/bash vdr x 100 33 Video Disk Recorder /var/spool/video /bin/false uucp x 10 14 Unix-to-Unix CoPy system /etc/uucp /bin/bash …
Leider interpretiert sort die Zahlen einfach als ASCII-Zeichenketten, die es alphabetisch sortiert. Dieses Verhalten führt dazu, dass beispielsweise die Zahl “534” vor “55” eingeordnet wird, weil alphabetisch gesehen “53” kleiner als “55” ist. In diesem Beispiel führt das dazu, dass die UID 100 vor der UID 2 eingeordnet wird. Abhilfe schafft die Option -n, mit der sort Nummern richtig einsortiert:
$ sort -nk 3 /etc/passwd root x 0 0 root /root /bin/bash bin x 1 1 bin /bin /bin/bash daemon x 2 2 Daemon /sbin /bin/bash …
Da die echte Passwortdatei keine Leerzeichen, sondern Doppelpunkte als Trenner zwischen den Einträgen enthält, muss es eine Möglichkeit geben, sort das verwendete Trennzeichen mit auf den Weg zu geben. Hier kommt der Parameter -t "trenner" ins Spiel. Geben Sie das Trennzeichen in Hochkommas eingeschlossen an, damit die Bash es nicht selbst interpretiert. Für die echte /etc/passwd verwenden Sie das Kommando:
sort -t ":" -nk 3 /etc/passwd
Weniger Freiraum
Spalten können Sie weiter eingrenzen, um ganz gezielt Bereiche zu definieren. Auch dieses Verhalten von sort lässt sich am besten anhand eines Beispiels nachvollziehen. Zu sortieren ist die folgende Datei sortfile:
1 Hühner sind laut. 2 Gänse sind lauter. 3 Enten sind laut. 4 Eier sind gut. 5 Zaunkönige sind allerhand Lärm. 6 Hühner gackern laut. 7 Gänse schnattern lauter. 8 Enten quaken laut.
Im ersten Beispielaufruf soll alles von der dritten Spalte ausgehend bis zum Zeilenende sortiert werden, d. h.: Wenn die dritte Spalte gleich ist (in der Datei taucht als drittes Wort häufig “sind” auf), schaut sort die vierte Spalte an, danach die fünfte usw.; das erledigt die Option -k 3:
$ sort -k 3 -k 2,2 sortfile 6 Hühner gackern laut. 8 Enten quaken laut. 7 Gänse schnattern lauter. 5 Zaunkönige sind allerhand Lärm. 4 Eier sind gut. 3 Enten sind laut. 1 Hühner sind laut. 2 Gänse sind lauter.
Wenn zwei Zeilen von der dritten Spalte an bis zum Zeilenende gleich sind (wie in den Zeilen 6 und 7), schaut sort ins zweite Feld (der zweite -k-Parameter) und sortiert – wie in diesem Fall – “Enten” alphabetisch vor “Hühnern” ein. Das Argument -k 3 steht also für “alle Spalten ab 3”, während Sie mit -k 2,2 die Spalten 2 bis 2 (also nur die zweite Spalte) ansprechen.
Als Nächstes schränken Sie die Sortierung auf die dritte Spalte ein:
$ sort -k 3,3 -k 2,2 sortfile 6 Hühner gackern laut. 8 Enten quaken laut. 7 Gänse schnattern lauter. 4 Eier sind gut. 3 Enten sind laut. 2 Gänse sind lauter. 1 Hühner sind laut. 5 Zaunkönige sind allerhand Lärm.
Durch das Komma abgetrennt geben Sie das Ende des Sortierbereichs an, hier also wiederum Spalte 3. Im Klartext heißt das: Alle Daten ab Spalte 4 bis zum Zeilenende werden ignoriert. Nachdem alle Zeilen (ausgehend vom Inhalt in Spalte 3) alphabetisch sortiert sind, schaut sort in Spalte 2 nach und sortiert weiter. Deutlich zu sehen in dieser Ausgabe: Spalte 3 enthält sehr häufig das Wort “sind”; für alle diese Zeilen gilt danach das zweite Feld als Kriterium, so werden die “Enten” vor den “Gänsen”, “Hühnern” und “Zaunkönigen” eingereiht.
Enthalten Spalten am Anfang Füllzeichen, die sort ignorieren soll, legen Sie fest, ab welcher Zeichenposition das Sortier-Tool die Spalte betrachtet: Um beispielsweise in der dritten Spalte ab dem vierten Zeichen zu sortieren, setzen Sie hinter die Spaltennummer durch einen Punkt getrennt die Zahl 4:
sort -k 3.4
Auch hier ist es möglich, das Ende des zu sortierenden Bereiches genauer definieren: Um diesen beispielsweise vom vierten Zeichen in der dritten Spalte bis zum fünften Zeichen in der vierten Spalte zu definieren, geben Sie ein:
sort -k 3.4,4.5
Noch mehr Sortierzauber
Sort kennt unzählige weitere Parameter, die bei täglichen Sortieraufgaben mehr oder weniger häufig zum Einsatz kommen. Die Manpage bietet hier eine gute Übersicht. Ein wirklich praktisches Feature ist, dass man verschiedene Parameter für die einzelnen Felder ein- und ausschalten kann. Die schon erwähnten Optionen -r (für die umgekehrte Sortierreihenfolge) und -n (für die korrekte Einordnung von Zahlen) schaltet sort nicht zwingend global ein. Sie aktivieren sie nach Bedarf für einzelne Felder – dadurch werden die Befehle aber ein wenig kryptisch:
sort -t ":" -k 4n,4 -k 3nr,3 /etc/passwd
Dieser Aufruf sortiert die Datei /etc/passwd und definiert zunächst wieder, dass die einzelnen Felder durch einen Doppelpunkt voneinander getrennt sind (-t ":"). Anschließend sortiert sort (numerisch korrekt) nach der Group ID (Feld 4) und danach in umgekehrter Reihenfolge nach der User ID.
Datei-Merger
Zwei bereits sortierte Dateien fügt sort auf Wunsch besonders schnell zu einer gemeinsamen (und immer noch sortierten) Datei zusammen – und zwar wesentlich schneller, als wenn man die Dateien mit cat datei1 datei2 | sort sortieren würde. Verwenden Sie zum Zusammenführen (engl.: “merge”) die Option -m:
sort -m datei1 datei2 > gemischt
Setzen Sie auch hier den zusätzlichen Parameter -u ein, um doppelte Einträge zu entfernen.
Teamwork mit anderen Befehlen
Seine ganze Stärke zeigt das Kommando im Zusammenspiel mit anderen Kommandozeilenbefehlen. Um beispielsweise den Inhalt des Verzeichnisses /boot in Langform und nach Dateigröße sortiert anzuzeigen, reichen Sie die Ausgabe des ls-Befehls über das Pipe-Zeichen direkt an das richtige sort-Kommando weiter (Listing 1).
Listing 1
$ ls -l /boot/ | sort -k 5g insgesamt 3792 lrwxrwxrwx 1 root root 1 2003-11-18 16:53 boot -> ./ lrwxrwxrwx 1 root root 23 2003-11-18 17:07 initrd -> initrd-2.4.21-99-athlon lrwxrwxrwx 1 root root 24 2003-11-18 16:57 vmlinuz -> vmlinuz-2.4.21-99-athlon drwxr-xr-x 2 root root 1024 2003-11-18 16:53 grub/ drwx—— 2 root root 12288 2003-11-18 16:47 lost+found/ -rw-r--r-- 1 root root 52224 2003-09-24 15:32 config-2.4.21-99-athlon …
Eine andere, von Administratoren häufig benutzte Kombination ist die Verknüpfung von du und sort, um “Plattenplatzfresser” aufzustöbern. Wer den Übeltäter in den Home-Verzeichnissen der Benutzer vermutet, überprüft das schnell mit:
$ du -s /home/* | sort -rn 6356156 /home/petronella 47304 /home/peggy 18864 /home/huhn …
Dieser du-Aufruf gibt dank des Parameters -s eine Übersicht der Größen aller Home-Verzeichnisse aus; die Ausgabe wandert anschließend durch die Pipe an den schon bekannten sort-Aufruf, und es wird schnell klar: Benutzer petronella belegt hier den meisten Platz.
Glossar
-
/etc/passwd
-
In dieser Datei liegen Informationen der Benutzerverwaltung. Neben den “echten” Benutzer-Accounts finden Sie hier allerdings auch Einträge für “Pseudobenutzer” wie lp (für den Drucker-Daemon) oder mail (für den Mail-Daemon): Daemons, die unter solchen Benutzer-IDs laufen, haben dann nicht die vollen Root-Rechte, sondern nur Zugriff auf die Daten, die für ihren Aufgabenbereich wichtig sind.





