docs/cut

annotate cut.txt @ 3:7cd149433a96

Zwischenstand
author markus schnalke <meillo@marmaro.de>
date Sat, 02 May 2015 18:47:00 +0200
parents 3659d2502d61
children d0b61c2bd25c
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@2 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@2 54 selektierte `cut -c' sowohl nach Ausgabezeichen als auch nach
meillo@2 55 Bytes. Mit dem Aufkommen von Multibyte-Kodierungen (wie UTF-8)
meillo@0 56 musste man sich von dieser Annahme loesen. In diesem Zug
meillo@2 57 bekam cut mit POSIX.2-1992 die Option `-b'. Diese selektiert
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@2 120 1992 veroeffentlicht wurde. 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@2 137 Mit POSIX.2 im Jahre 1992 wurde cut zum ersten Mal in der
meillo@2 138 heutigen Form (mit -b) standardisiert. In der urspruenglichen
meillo@2 139 Variante (ohne -b) taucht es u.a. 1985 in der System V
meillo@2 140 Interface Definition, einer wichtigen formalen Beschreibung
meillo@2 141 von UNIX System V, auf.
meillo@1 142
meillo@1 143
meillo@2 144 Beschreibungen
meillo@1 145
meillo@2 146 Interessant ist ein Vergleich der Kurzbeschreibungen von cut,
meillo@3 147 wie sie sich in der Titelzeile von Manpages oder manchmal auch
meillo@2 148 am Anfang der Quellcodedatei findet.
meillo@2 149
meillo@3 150 Die folgende Liste ist grob nach Zeit georndet und nach
meillo@3 151 Abstammung gruppiert. Die mit ``(src)'' markierten
meillo@3 152 Beschreibungen wurden im Code gefunden. POSIX und der ``Unix
meillo@3 153 Reader'' sind Textdokumente, die nicht an eine bestimmte
meillo@3 154 Unix-Version gebunden sind. Alle uebrigen Beschreibungen
meillo@3 155 entstammen der jeweiligen Manpage.
meillo@3 156
meillo@3 157
meillo@2 158 System III cut out selected fields of each line of a file
meillo@3 159 System III (src) cut and paste columns of a table (projection of a relation)
meillo@2 160 System V cut out selected fields of each line of a file
meillo@2 161 HP-UX cut out (extract) selected fields of each line of a file
meillo@2 162
meillo@3 163 4.3BSD-UWisc (src) cut and paste columns of a table (projection of a relation)
meillo@2 164 4.3BSD-Reno select portions of each line of a file
meillo@2 165 NetBSD select portions of each line of a file
meillo@2 166 FreeBSD 1.0 select portions of each line of a file
meillo@3 167 FreeBSD 7.0 cut out selected portions of each line of a file
meillo@2 168 SunOS 4.1.3 remove selected fields from each line of a file
meillo@2 169 SunOS 5.5.1 cut out selected fields of each line of a file
meillo@2 170
meillo@2 171 POSIX cut out selected fields of each line of a file
meillo@2 172
meillo@2 173 GNU coreutils remove sections from each line of files
meillo@2 174
meillo@2 175 Minix select out columns of a file
meillo@2 176
meillo@2 177 Version 8 Unix rearrange columns of data
meillo@2 178 ``Unix Reader'' rearrange columns of text
meillo@2 179
meillo@2 180
meillo@2 181
meillo@3 182 Codevergleich
meillo@2 183
meillo@2 184
meillo@2 185