docs/cut

annotate cut.txt @ 1:a3f18ccc3996

Zwischenstand
author markus schnalke <meillo@marmaro.de>
date Sat, 02 May 2015 13:45:00 +0200
parents 5efb052a0d9e
children 3659d2502d61
rev   line source
meillo@0 1 Das Werkzeugkaestle
meillo@0 2
meillo@0 3 #1: cut - cut out selected fields of each line of a file
meillo@0 4 ---------------------------------------------------------
meillo@0 5 markus schnalke, 2015-04
meillo@0 6
meillo@0 7
meillo@1 8 Cut ist ein klassisches Programm im Unix-Werkzeugkasten.
meillo@0 9 In keinem ordentlichen Tutorial zur Shellprogrammierung darf
meillo@0 10 es fehlen. Es ist ein schoenes Anschauungs- und Beispielobjekt
meillo@0 11 fuer's Shellscripting. Hier soll es portraitiert werden.
meillo@0 12
meillo@0 13
meillo@0 14 Die Funktionsbasis von cut sind urspruenglich zwei Modi, die
meillo@0 15 spaeter um einen dritten erweitert wurden. Entweder cut
meillo@0 16 schneidet bestimmte Zeichen aus den Zeilen der Eingabe oder
meillo@0 17 bestimmte durch Trennzeichen definierte Felder.
meillo@0 18
meillo@0 19 Der Zeichenmodus ist besonders praktisch um bestimmte Teile
meillo@0 20 von Kommandoausgaben zu extrahieren. Ein populaeres
meillo@0 21 Beispiel ist die Jahreszahl, die aus einer Datumsangabe
meillo@0 22 herausgeschnitten werden soll, insofern das Datumsformat
meillo@0 23 nicht frei gewaehlt werden kann. Ein anderer Anwendungsfall
meillo@0 24 ist die Extraktion bestimmter Zugriffsrecht. Hier z.B. die
meillo@0 25 Rechte fuer den Besitzer:
meillo@0 26
meillo@0 27 ls -l foo | cut -c 2-4
meillo@0 28
meillo@0 29 Oder die Schreibrechte fuer die Gruppe und alle anderen:
meillo@0 30
meillo@0 31 ls -l | cut -c 6,9
meillo@0 32
meillo@0 33 Damit ist die grundsaetzliche Verwendung von cut
meillo@0 34 demonstriert.
meillo@0 35
meillo@0 36 Die fuer POSIX wichtige Funktion von cut ist die Faehigkeit
meillo@0 37 lange Zeilen zu kuerzen.
meillo@0 38
meillo@0 39 cut -c -80
meillo@0 40
meillo@0 41 Dieser Befehl uebernimmt nur die ersten 80 Zeichen der
meillo@0 42 Eingabe in die Ausgabe. Der Rest der Zeilen wird einfach
meillo@0 43 abgeschnitten, koennte aber mit `cut -c 81-' extrahiert
meillo@0 44 werden.
meillo@0 45
meillo@0 46 Achtzig Zeichen erinnert unweigerlich an VT100-Terminals,
meillo@0 47 das 80 Zeichen pro Zeile darstellen kann. Geht es aber nicht
meillo@0 48 um die Darstellung von Zeichen sondern um ihre Speicherung,
meillo@0 49 dann ist `-c' nicht unbedingt die passende Option zur Kuerzung
meillo@0 50 langer Zeilen.
meillo@0 51
meillo@1 52 Frueher als US-ASCII omnipraesente als Zeichensatz und -kodierung
meillo@0 53 war, war jedes Zeichen durch genau ein Byte kodiert und somit
meillo@0 54 beschnitt `cut -c' sowohl nach Ausgabezeichen als auch nach
meillo@1 55 Datenmenge. Als aber Multibyte-Kodierungen (z.B. UTF-8) aufkamen,
meillo@0 56 musste man sich von dieser Annahme loesen. In diesem Zug
meillo@0 57 bekam cut mit POSIX.2 die Option `-b'. Diese selektiert nach
meillo@1 58 Bytes. Will man also nur die ersten maximal 20 Bytes vor dem
meillo@0 59 Newline-Zeichen stehen haben (und den Rest stillschweigend
meillo@0 60 ignorieren), dann macht man das mit:
meillo@0 61
meillo@1 62 cut -b -20
meillo@0 63
meillo@0 64
meillo@0 65 Neben dem Zeichen- bzw. Byte-Modus bietet cut noch den
meillo@0 66 interessanteren Feld-Modus, den man mit `-f' einleitet. Mit ihm
meillo@0 67 koennen Felder ausgewaehlt werden. Das Trennzeichen -- per
meillo@0 68 Default der Tab -- kann mit `-d' geaendert werden.
meillo@0 69
meillo@0 70 Der typische Anwendungsfall fuer den Feld-Modus. Ist die
meillo@0 71 Extraktion von Information aus der passwd-Datei. So z.B. der
meillo@0 72 Username, die User-ID und das Homeverzeichnis:
meillo@0 73
meillo@0 74 cut -d: -f1,3,6 /etc/passwd
meillo@0 75
meillo@0 76 (Die Argumente fuer die Optionen koennen bei cut uebrigens
meillo@0 77 direkt angehaengt oder mit Whitespace abgetrennt folgen.)
meillo@0 78
meillo@0 79
meillo@0 80 Dieser Feld-Modus ist fuer einfache tabellarische Dateien
meillo@0 81 (wie eben die passwd) gut geeignet, kommt aber schnell an
meillo@0 82 seine Grenzen. Gerade der uebliche Fall, dass an Whitespace
meillo@0 83 in Felder geteilt werden soll, wird damit nicht abgedeckt.
meillo@0 84 Der Delimiter kann nur genau ein Zeichen sein. Es kann also
meillo@0 85 nicht sowohl an Leerzeichen als auch an Tabs getrennt werden.
meillo@0 86 Auch unterteilt cut an jedem Trennzeichen. Zwei aneinander
meillo@0 87 stehende Trennzeichen fuehren zu einem leeren Feld. Solches
meillo@0 88 Verhalten ist fuer Whitespace-getrennte Felder unangemessen.
meillo@0 89 Diese Aufgaben deckt aber zum Glueck awk ab, so dass die
meillo@0 90 Alternative zur Hand ist.
meillo@0 91
meillo@0 92 Awk hat eine weitere Funktion, die
meillo@0 93 cut missen laesst: Das Tauschen der Feld-Reihenfolge.
meillo@0 94
meillo@0 95
meillo@0 96
meillo@0 97
meillo@0 98
meillo@0 99 Geschichtliches
meillo@0 100
meillo@1 101 Cut erblickte 1982 als Teil von UNIX System III das Licht der
meillo@1 102 oeffentlichen Welt. In den Quellen von System III findet sich
meillo@1 103 cut.c mit dem Zeitstempel 1980-04-11.
meillo@1 104 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/cmd
meillo@0 105
meillo@1 106 Aber werfen wir doch einen Blick auf die BSD-Linie: Dort ist mein
meillo@1 107 fruehester Fund ein cut.c mit dem Datum 1986-11-07 im Code der
meillo@1 108 Spezialversion 4.3BSD-UWisc, die im Januar 1987 veroeffentlicht
meillo@1 109 .
meillo@1 110 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-UWisc/src/usr.bin/cut
meillo@1 111 Im bekannteren 4.3BSD-Tahoe (1988) taucht es nicht auf. Im
meillo@1 112 darauf folgenden 4.3BSD-Reno (1990) gibt es aber wiederum ein
meillo@1 113 cut, das von Adam S. Moskowitz und Marciano Pitargue geschrieben
meillo@1 114 und 1989 in BSD aufgenommen worden ist.
meillo@1 115 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut
meillo@1 116 Die Manpage
meillo@1 117 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut/cut.1
meillo@1 118 erwaehnt bereits die angestrebte aber noch vermutete Konformitaet
meillo@1 119 zu POSIX.2. Man muss wissen, dass POSIX.2 erst im September
meillo@1 120 1992 veroeffentlicht wird. Die Aussage basiert also auf dem
meillo@1 121 Zwischenstand nach zweieinhalb der insgesamt fuenf Jahre, die
meillo@1 122 die Arbeiten am Standard benoetigten.
meillo@0 123
meillo@1 124 Trotz all dieser Jahreszahlen aus den 80er Jahren gehoert cut
meillo@1 125 aus Sicht des urspruenglichen Unix zu den juengeren Tools.
meillo@1 126 Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist,
meillo@1 127 so existierte Unix wiederum schon ein ganzes Jahrzehnt bevor cut
meillo@1 128 das erste Mal auftauchte. Insbesondere war cut nicht in Version 7
meillo@1 129 Unix vorhanden, das die Ausgangsbasis aller modernen Unix-Systeme
meillo@1 130 darstellt. (Das weit komplexere sed z.B. war dort schon
meillo@1 131 vertreten.)
meillo@0 132
meillo@1 133 Nichts desto trotz bewaehrte sich cut. Es wurde in andere
meillo@1 134 Unix Varianten uebernommen und ist heutzutage ueberall
meillo@1 135 anzutreffen.
meillo@1 136
meillo@1 137 Die Beschreibung von cut in POSIX.2 1992 ist sicher wichtig,
meillo@1 138 zuvor war cut aber schon 1987 im X/OPEN Portability Guide,
meillo@1 139 Issue 2, Vol. 1, und davor sogar schon 1985 in der System V
meillo@1 140 Interface Definition beschrieben worden.
meillo@1 141
meillo@1 142
meillo@1 143