Mercurial > docs > cut
view cut.txt @ 0:5efb052a0d9e
Zwischenstand
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Sat, 02 May 2015 09:54:00 +0200 |
parents | |
children | a3f18ccc3996 |
line wrap: on
line source
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