docs/cut

view cut.txt @ 2:3659d2502d61

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