News Ticker

Unix-Tools 1: cut

Ich werde euch in dieser Reihe jeden Dienstag eine kleine Einführung in bekannte, unbekannte, einfache und schwierige Unix-Tools geben. Den Anfang macht cut (dt. schneiden) welches zu den Text verarbeitenden Programmen gehört. Um etwas genauer zu sein: es zerschneidet den Text anhand von so genannten Delimiters (dt. Trennzeichen). Das sind einfache Zeichen die zwischen den gewünschten Wörtern stehen. Genug mit der Theorie, hier ein paar Beispiele. Ein typischer Anwendungsbereich ist die Passwort-Datei unter Linux /etc/passwd. Ich habe meine (aus mir unerklärlichen Gründen ;)) kaputte Datei in ein beliebiges Verzeichnis kopiert um damit arbeiten zu können.


Der Inhalt:

lp:x:4:7:lp:/var/spool/lpd:/bin/false
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
haltnews:x:9:13:news:/usr/lib/news:/bin/false

Wir rufen das Programm mit cut -c1 passwd auf und bekommen als Output:

l
s
s
hn

Hier steht -c für character (dt. Zeichen) und 1 gibt somit das erste Zeichen jeder Zeile aus. Damit kommen wir schon zum ersten wichtigen Punkt: cut arbeitet zeilenbasiert. Das heißt, dass alle Optionen immer Zeile für Zeile abgearbeitet werden. Das zu wissen hilft manchmal sehr beim Fehler suchen wenn man wieder was nicht so funktioniert wie es eigentlich sollte.

cut kann aber auch mehrere Zeichen ausgeben. Cut -c1-10 passwd gibt die ersten zehn Zeichen (jeder Zeile) aus. Ist ja schön und gut, werdet ihr vielleicht sagen, aber was will man damit? Das ist doch viel zu umständlich und zu unflexibel. Stimmt! Deshalb jetzt zu den angenehmeren Sachen. cut kann mit den oben genannten Trennzeichen arbeiten. Wenn ein Trennzeichen angegeben wird, muss auch wieder ein Feld angegeben werden sonst bleibt der Bildschirm schwarz. cut -d: -f1 passwd gibt folgendes aus:

lp
sync
shutdown
haltnews

Schaut euch den Output in Ruhe an. Hier gibt es mehrere Sachen zu erwähnen. Als erstes trennt cut die Datei richtig auf. Jede Zeile wird in Felder eingeteilt wobei jedes durch ein “:” getrennt wird. Die Option -f1 gibt also das erste Feld aus, -f2 das zweite usw. Aber es werden auch Zeilen ausgegeben, die leer sind bzw. keine Trennzeichen enthalten und das sieht weder schön aus noch ist es praktisch. cut kann auch da Abhilfe schaffen – mit der Option -s.
cut -d: -f1 -s passwd gibt dann richtig aus (ohne halt und ohne Leerzeile):

lp
sync
shutdown
news

Auch bei der Feldangabe ist cut relativ flexibel:

cut -d: -f5 -s passwd Feld 5
cut -d: -f5- -s passwd Ab Feld 5 bis zum Ende der Zeile
cut -d: -f-3 -s passwd Vom Anfang der Zeile bis Feld 3
cut -d: -f3-5 -s passwd Feld 3 bis Feld 5

Zu guter Letzt noch ein Beispiel aus meinem Studium. Es ging um das Spiel Total Club Manager welches mit CSV (comma separated values; dt. Komma getrennten Werten) arbeitet. Eine Datei Nation.csv sah ungefähr so aus:

a01, "Afghanistan", "Afghanistan", AFG, "Afghan"
a02, "Albania", "Albania", ALB, "Albanian"
a03, "Algeria", "Algeria", ALG, "Algerian"
a04, "American Samoa", "American Samoa", ASA, "American Samoan"
a05, "Andorra", "Andorra", AND, "Andorran"

Ich sollte anmerken, dass das die kleinste Datei von allen war und nur 224 Zeilen hatte, andere hatten mehrere Millionen. Mit eurem Wissen ist es kein Problem mehr eine Liste aller Länder zu extrahieren: cut -d, -f2 Nation.csv

Als Ergebnis bekommen wir:


"Afghanistan"
"Albania"
"Algeria"
"American Samoa"
"Andorra"

Jetzt werden wie einige von euch sagen: Schön und gut, aber was will man mit der Liste wenn noch Anführungszeichen dabei sind? Stimmt wieder! Das bringt mich zu meinem Abschlussstatement: Die Philosophie von UNIX und Linux ist es nicht ein riesengroßes Programm zu schreiben was alles kann, sondern ein kleines Tool zu erstellen, dass genau eine Aufgabe erledigt – und zwar effizient. Ein schwieriges Problem wird so in viele kleinere Teilprobleme dekomponiert die einfacher zu lösen sind. Ganz konkret bedeutet das, dass das zertrennen mit cut gut funktioniert. Zeichen nach einem bestimmten Muster zu entfernen gehört aber zur Aufgabe eines anderen Programms. Zum Abschluss die obligatorische Empfehlung: Schaut euch ruhig mal die man-page an (man cut). Gerade die cut-Seite ist kurz und übersichtlich zusammengefasst.

Ich hoffe euch hat mein erster Fachartikel hier wenigstens halbwegs zugesagt. Bei Fragen und Problemen einfach einen Kommentar posten und ich antworte so schnell ich kann.