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