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@2
|
147 wie man sie in der Titelzeile der Manpages oder manchmal auch
|
meillo@2
|
148 am Anfang der Quellcodedatei findet.
|
meillo@2
|
149
|
meillo@2
|
150 System III cut out selected fields of each line of a file
|
meillo@2
|
151 System III code cut and paste columns of a table (projection of a relation)
|
meillo@2
|
152 System V cut out selected fields of each line of a file
|
meillo@2
|
153 SVID cut out selected fields of each line of a file
|
meillo@2
|
154 HP-UX cut out (extract) selected fields of each line of a file
|
meillo@2
|
155
|
meillo@2
|
156 4.3BSD-UWisc cut and paste columns of a table (projection of a relation)
|
meillo@2
|
157 4.3BSD-Reno select portions of each line of a file
|
meillo@2
|
158 NetBSD select portions of each line of a file
|
meillo@2
|
159 FreeBSD 1.0 select portions of each line of a file
|
meillo@2
|
160 FreeBSD >2007 cut out selected portions of each line of a file
|
meillo@2
|
161 SunOS 4.1.3 remove selected fields from each line of a file
|
meillo@2
|
162 SunOS 5.5.1 cut out selected fields of each line of a file
|
meillo@2
|
163
|
meillo@2
|
164 POSIX cut out selected fields of each line of a file
|
meillo@2
|
165
|
meillo@2
|
166 GNU coreutils remove sections from each line of files
|
meillo@2
|
167
|
meillo@2
|
168 Minix select out columns of a file
|
meillo@2
|
169
|
meillo@2
|
170 Version 8 Unix rearrange columns of data
|
meillo@2
|
171 ``Unix Reader'' rearrange columns of text
|
meillo@2
|
172
|
meillo@2
|
173
|
meillo@2
|
174
|
meillo@2
|
175
|
meillo@2
|
176
|
meillo@2
|
177
|
meillo@2
|
178
|
meillo@2
|
179
|