# HG changeset patch # User markus schnalke # Date 1430553240 -7200 # Node ID 5efb052a0d9e83d48c610728891630a0e05eb961 Zwischenstand diff -r 000000000000 -r 5efb052a0d9e cut.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cut.txt Sat May 02 09:54:00 2015 +0200 @@ -0,0 +1,109 @@ +Das Werkzeugkaestle + +#1: cut - cut out selected fields of each line of a file +--------------------------------------------------------- +markus schnalke, 2015-04 + + +Cut ist eines der klassischen Programme im Unix-Werkzeugkasten. +In keinem ordentlichen Tutorial zur Shellprogrammierung darf +es fehlen. Es ist ein schoenes Anschauungs- und Beispielobjekt +fuer's Shellscripting. Hier soll es portraitiert werden. + + +Die Funktionsbasis von cut sind urspruenglich zwei Modi, die +spaeter um einen dritten erweitert wurden. Entweder cut +schneidet bestimmte Zeichen aus den Zeilen der Eingabe oder +bestimmte durch Trennzeichen definierte Felder. + +Der Zeichenmodus ist besonders praktisch um bestimmte Teile +von Kommandoausgaben zu extrahieren. Ein populaeres +Beispiel ist die Jahreszahl, die aus einer Datumsangabe +herausgeschnitten werden soll, insofern das Datumsformat +nicht frei gewaehlt werden kann. Ein anderer Anwendungsfall +ist die Extraktion bestimmter Zugriffsrecht. Hier z.B. die +Rechte fuer den Besitzer: + + ls -l foo | cut -c 2-4 + +Oder die Schreibrechte fuer die Gruppe und alle anderen: + + ls -l | cut -c 6,9 + +Damit ist die grundsaetzliche Verwendung von cut +demonstriert. + +Die fuer POSIX wichtige Funktion von cut ist die Faehigkeit +lange Zeilen zu kuerzen. + + cut -c -80 + +Dieser Befehl uebernimmt nur die ersten 80 Zeichen der +Eingabe in die Ausgabe. Der Rest der Zeilen wird einfach +abgeschnitten, koennte aber mit `cut -c 81-' extrahiert +werden. + +Achtzig Zeichen erinnert unweigerlich an VT100-Terminals, +das 80 Zeichen pro Zeile darstellen kann. Geht es aber nicht +um die Darstellung von Zeichen sondern um ihre Speicherung, +dann ist `-c' nicht unbedingt die passende Option zur Kuerzung +langer Zeilen. + +Frueher als US-ASCII das omnipraesente Charset und Encoding +war, war jedes Zeichen durch genau ein Byte kodiert und somit +beschnitt `cut -c' sowohl nach Ausgabezeichen als auch nach +Datenmenge. Als aber Multibyte-Kodierungen, wie UTF-8, aufkamen, +musste man sich von dieser Annahme loesen. In diesem Zug +bekam cut mit POSIX.2 die Option `-b'. Diese selektiert nach +Bytes. Will man also nur die ersten maximal 63 Bytes vor dem +Newline-Zeichen stehen haben (und den Rest stillschweigend +ignorieren), dann macht man das mit: + + cut -b -63 + + +Neben dem Zeichen- bzw. Byte-Modus bietet cut noch den +interessanteren Feld-Modus, den man mit `-f' einleitet. Mit ihm +koennen Felder ausgewaehlt werden. Das Trennzeichen -- per +Default der Tab -- kann mit `-d' geaendert werden. + +Der typische Anwendungsfall fuer den Feld-Modus. Ist die +Extraktion von Information aus der passwd-Datei. So z.B. der +Username, die User-ID und das Homeverzeichnis: + + cut -d: -f1,3,6 /etc/passwd + +(Die Argumente fuer die Optionen koennen bei cut uebrigens +direkt angehaengt oder mit Whitespace abgetrennt folgen.) + + +Dieser Feld-Modus ist fuer einfache tabellarische Dateien +(wie eben die passwd) gut geeignet, kommt aber schnell an +seine Grenzen. Gerade der uebliche Fall, dass an Whitespace +in Felder geteilt werden soll, wird damit nicht abgedeckt. +Der Delimiter kann nur genau ein Zeichen sein. Es kann also +nicht sowohl an Leerzeichen als auch an Tabs getrennt werden. +Auch unterteilt cut an jedem Trennzeichen. Zwei aneinander +stehende Trennzeichen fuehren zu einem leeren Feld. Solches +Verhalten ist fuer Whitespace-getrennte Felder unangemessen. +Diese Aufgaben deckt aber zum Glueck awk ab, so dass die +Alternative zur Hand ist. + +Awk hat eine weitere Funktion, die +cut missen laesst: Das Tauschen der Feld-Reihenfolge. + + + + + +Geschichtliches + +Cut erblickte in XXX das Licht der Welt. Im Verleich zu +XXX stiess es erst relativ spaet XXX + +XXX ueber XXX floss +es in den XXX Standard ein, wo es seither residiert. + +Standardisierung + +Verbreitung