rev |
line source |
meillo@6
|
1 Das Werkzeugkaestle, #1
|
meillo@0
|
2
|
meillo@6
|
3 cut - cut out selected fields of each line of a file
|
meillo@6
|
4 ----------------------------------------------------
|
meillo@6
|
5 markus schnalke <meillo@marmaro.de>
|
meillo@6
|
6 2015-05
|
meillo@0
|
7
|
meillo@0
|
8
|
meillo@1
|
9 Cut ist ein klassisches Programm im Unix-Werkzeugkasten.
|
meillo@8
|
10 In keinem ordentlichen Tutorial zur Shellprogrammierung fehlt
|
meillo@9
|
11 es, denn es ist ein schoenes, praktisches und anschauliches
|
meillo@9
|
12 Helferlein. Hier soll ein wenig hinter seine Fassade geschaut
|
meillo@9
|
13 werden.
|
meillo@0
|
14
|
meillo@0
|
15
|
meillo@4
|
16 Funktionsweise
|
meillo@4
|
17
|
meillo@8
|
18 Urspruenglich hatte cut zwei Modi, die spaeter um einen dritten
|
meillo@9
|
19 erweitert wurden. Cut schneidet entweder gewuenschte Zeichen aus
|
meillo@9
|
20 den Zeilen der Eingabe oder gewuenschte, durch Trennzeichen
|
meillo@8
|
21 definierte, Felder.
|
meillo@0
|
22
|
meillo@9
|
23 Der Zeichenmodus ist optimal geeignet um Festbreitenformate zu
|
meillo@8
|
24 zerteilen. So kann man damit beispielsweise bestimmte
|
meillo@9
|
25 Zugriffsrechte aus der Ausgabe von `ls -l' ausschneiden, in
|
meillo@9
|
26 diesem Beispiel die Rechte des Besitzers:
|
meillo@0
|
27
|
meillo@4
|
28 $ ls -l foo | cut -c 2-4
|
meillo@4
|
29 rw-
|
meillo@0
|
30
|
meillo@4
|
31 Oder die Schreibrechte des Besitzers, der Gruppe und der
|
meillo@4
|
32 Welt:
|
meillo@0
|
33
|
meillo@4
|
34 $ ls -l | cut -c 3,6,9
|
meillo@4
|
35 ww-
|
meillo@0
|
36
|
meillo@4
|
37 Mit cut lassen sich aber auch Strings kuerzen.
|
meillo@0
|
38
|
meillo@10
|
39 $ long=12345678901234567890
|
meillo@10
|
40 $ echo "$long" | cut -c -10
|
meillo@10
|
41 1234567890
|
meillo@0
|
42
|
meillo@10
|
43 Dieser Befehl gibt die ersten maximal 10 Zeichen von
|
meillo@8
|
44 `$long' aus. (Alternativ kann man hierfuer auch `printf
|
meillo@10
|
45 "%.10s\n" "$long"' verwenden.)
|
meillo@0
|
46
|
meillo@4
|
47 Geht es aber nicht um die Darstellung von Zeichen, sondern um
|
meillo@8
|
48 ihre Speicherung, dann ist `-c' nicht unbedingt geeignet.
|
meillo@8
|
49 Frueher, als US-ASCII als Zeichensatz und -kodierung
|
meillo@4
|
50 noch omnipraesent war, wurde jedes Zeichen mit genau einem
|
meillo@4
|
51 Byte gespeichert. Somit selektierte `cut -c' gleichermassen
|
meillo@4
|
52 sowohl Ausgabezeichen als auch Bytes. Mit dem Aufkommen von
|
meillo@4
|
53 Multibyte-Kodierungen (wie UTF-8) musste man sich jedoch von
|
meillo@4
|
54 dieser Annahme loesen. In diesem Zug bekam cut mit
|
meillo@9
|
55 POSIX.2-1992 einen Bytemodus (Option `-b'). Will man
|
meillo@4
|
56 also nur die ersten maximal 500 Bytes vor dem
|
meillo@0
|
57 Newline-Zeichen stehen haben (und den Rest stillschweigend
|
meillo@0
|
58 ignorieren), dann macht man das mit:
|
meillo@0
|
59
|
meillo@6
|
60 $ cut -b -500
|
meillo@0
|
61
|
meillo@4
|
62 Den Rest kann man sich mit `cut -b 501-' einfangen. Diese
|
meillo@8
|
63 Funktion ist insbesondere fuer POSIX wichtig, da man so
|
meillo@8
|
64 Textdateien mit begrenzter Zeilenlaenge erzeugen kann.
|
meillo@4
|
65 [ http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html#tag_20_28_17
|
meillo@0
|
66
|
meillo@10
|
67 Auch wenn der Bytemodus neu eingefuehrt wurde, so sollte er
|
meillo@10
|
68 sich doch nur so verhalten wie der alte Zeichenmodus normalerweise
|
meillo@10
|
69 implementiert war. Beim Zeichenmodus aber wurde durch POSIX.2
|
meillo@10
|
70 eine andere Implementierungsweise gefordert. Das Problem war
|
meillo@10
|
71 also nicht, den neuen Bytemodus zu implementieren, sondern
|
meillo@10
|
72 den Zeichenmodus neu zu implementieren.
|
meillo@10
|
73
|
meillo@10
|
74 Neben dem Zeichen- und Byte-Modus bietet cut noch den
|
meillo@8
|
75 Feld-Modus, den man mit `-f' einleitet. Mit ihm
|
meillo@4
|
76 koennen Felder ausgewaehlt werden. Das Trennzeichen (per
|
meillo@4
|
77 Default der Tab) kann mit `-d' geaendert werden.
|
meillo@0
|
78
|
meillo@8
|
79 Der typische Anwendungsfall fuer cut im Feld-Modus ist die
|
meillo@8
|
80 Auswahl von Information aus der passwd-Datei. So z.B. der
|
meillo@10
|
81 Benutzername, seine ID und das Homeverzeichnis:
|
meillo@0
|
82
|
meillo@6
|
83 $ cut -d: -f1,3,6 /etc/passwd
|
meillo@9
|
84 root:0:/root
|
meillo@9
|
85 bin:1:/bin
|
meillo@9
|
86 daemon:2:/sbin
|
meillo@9
|
87 mail:8:/var/spool/mail
|
meillo@9
|
88 ...
|
meillo@0
|
89
|
meillo@0
|
90 (Die Argumente fuer die Optionen koennen bei cut uebrigens
|
meillo@8
|
91 mit Whitespace abgetrennt oder direkt angehaengt folgen.)
|
meillo@0
|
92
|
meillo@4
|
93 Dieser Feld-Modus ist fuer einfache tabellarische Dateien,
|
meillo@4
|
94 wie eben die passwd, gut geeignet. Er kommt aber schnell an
|
meillo@9
|
95 seine Grenzen. Gerade der haeufige Fall, dass an Whitespace
|
meillo@0
|
96 in Felder geteilt werden soll, wird damit nicht abgedeckt.
|
meillo@0
|
97 Der Delimiter kann nur genau ein Zeichen sein. Es kann also
|
meillo@0
|
98 nicht sowohl an Leerzeichen als auch an Tabs getrennt werden.
|
meillo@0
|
99 Auch unterteilt cut an jedem Trennzeichen. Zwei aneinander
|
meillo@4
|
100 stehende Trennzeichen fuehren zu einem leeren Feld. Dieses
|
meillo@8
|
101 Verhalten widerspricht den Erwartungen, die man an die
|
meillo@8
|
102 Verarbeitung einer Datei mit Whitespace-getrennten Feldern
|
meillo@8
|
103 hat. Manche Implementierungen von cut, z.B. die von FreeBSD,
|
meillo@9
|
104 haben aber Erweiterungen, die das gewuenschte Verhalten fuer
|
meillo@8
|
105 Whitespace-getrennte Felder bieten. Ansonsten, d.h. wenn
|
meillo@9
|
106 man portabel bleiben will, verwendet man awk in diesen
|
meillo@9
|
107 Faellen.
|
meillo@0
|
108
|
meillo@4
|
109 Awk bietet noch eine weitere Funktion, die cut missen
|
meillo@8
|
110 laesst: Das Tauschen der Feld-Reihenfolge in der Ausgabe. Bei
|
meillo@8
|
111 cut ist die Reihenfolge der Feldauswahlangabe irrelevant; ein
|
meillo@8
|
112 Feld kann selbst mehrfach angegeben werden. So gibt der Aufruf
|
meillo@8
|
113 von `cut -c 5-8,1,4-6' die Zeichen Nummer 1, 4, 5, 6, 7 und 8
|
meillo@8
|
114 in genau dieser Reihenfolge aus. Die Auswahl entspricht damit
|
meillo@8
|
115 der Mengenlehre in der Mathematik: Jedes angegebene Feld wird
|
meillo@9
|
116 Teil der Ergebnismenge. Die Felder der Ergebnismenge sind
|
meillo@9
|
117 dabei immer gleich geordnet wie in der Eingabe. Um die Worte
|
meillo@9
|
118 der Manpage XXX von Version 8 Unix wiederzugeben: ``In data base
|
meillo@9
|
119 parlance, it projects a relation.''
|
meillo@9
|
120 [ XXX
|
meillo@8
|
121 Cut fuehrt also die Datenbankoperation Projektion auf
|
meillo@10
|
122 Textdateien aus. Die Wikipedia erklaert das folgendermassen:
|
meillo@7
|
123
|
meillo@7
|
124 Die Projektion entspricht der Projektionsabbildung aus der
|
meillo@7
|
125 Mengenlehre und kann auch Attributbeschränkung genannt
|
meillo@7
|
126 werden. Sie extrahiert einzelne Attribute aus der
|
meillo@7
|
127 ursprünglichen Attributmenge und ist somit als eine Art
|
meillo@7
|
128 Selektion auf Spaltenebene zu verstehen, das heißt, die
|
meillo@7
|
129 Projektion blendet Spalten aus.
|
meillo@7
|
130
|
meillo@8
|
131 [ http://de.wikipedia.org/wiki/Projektion_(Informatik)#Projektion
|
meillo@8
|
132
|
meillo@7
|
133
|
meillo@0
|
134 Geschichtliches
|
meillo@0
|
135
|
meillo@4
|
136 Cut erblickte 1982 mit dem Release von UNIX System III das
|
meillo@4
|
137 Licht der oeffentlichen Welt. Wenn man die Quellen von System
|
meillo@4
|
138 III durchforstet, findet man die Quellcodedatei cut.c mit dem
|
meillo@4
|
139 Zeitstempel 1980-04-11.
|
meillo@1
|
140 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/cmd
|
meillo@4
|
141 Das ist die aelteste Manifestation des Programms, die ich
|
meillo@8
|
142 aufstoebern konnte. Allerdings spricht die sccsid im
|
meillo@8
|
143 Quellcode von Version 1.5. Es muss also noch eine
|
meillo@8
|
144 Vorgeschichte geben. Zu dieser habe ich leider keinen Zugang
|
meillo@8
|
145 gefunden.
|
meillo@9
|
146 XXX mail an TUHS
|
meillo@0
|
147
|
meillo@10
|
148 Nun ein Blick auf die BSD-Linie: Dort ist mein
|
meillo@8
|
149 fruehester Fund ein cut.c mit dem Dateimodifikationsdatum
|
meillo@8
|
150 1986-11-07
|
meillo@8
|
151 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-UWisc/src/usr.bin/cut
|
meillo@8
|
152 als Teil der Spezialversion 4.3BSD-UWisc,
|
meillo@6
|
153 [ http://gunkies.org/wiki/4.3_BSD_NFS_Wisconsin_Unix
|
meillo@6
|
154 die im Januar 1987 veroeffentlicht wurde.
|
meillo@8
|
155 Die Implementierung unterscheidet sich nur minimal von der
|
meillo@8
|
156 in System III.
|
meillo@8
|
157 Im bekannteren 4.3BSD-Tahoe (1988) taucht cut nicht auf.
|
meillo@8
|
158 Das darauf folgende 4.3BSD-Reno (1990) liefert aber wieder
|
meillo@8
|
159 ein cut mit aus. Dieses cut ist ein von Adam S. Moskowitz und
|
meillo@8
|
160 Marciano Pitargue neu implementiertes cut, das 1989 in BSD
|
meillo@8
|
161 aufgenommen wurde.
|
meillo@1
|
162 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut
|
meillo@4
|
163 Seine Manpage
|
meillo@1
|
164 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut/cut.1
|
meillo@4
|
165 erwaehnt bereits die erwartete Konformitaet mit POSIX.2.
|
meillo@9
|
166 XXX 2 oder 3 modi?
|
meillo@4
|
167 Nun sollte man wissen, dass POSIX.2 erst im September
|
meillo@10
|
168 1992 veroeffentlicht wurde, also gut zwei Jahren nachdem die
|
meillo@8
|
169 Manpage und das Programm geschrieben wurden. Das Programm
|
meillo@10
|
170 wurde folglich anhand von Arbeitsversionen des Standards
|
meillo@4
|
171 implementiert. Zweieinhalb Jahre Arbeit war immerhin schon in
|
meillo@4
|
172 den Standardisierungsprozess geflossen; bis zur
|
meillo@8
|
173 Fertigstellung sollte es aber noch weitere zwei Jahre dauern.
|
meillo@0
|
174
|
meillo@9
|
175 Das cut der GNU Coreutils enthaelt einen Copyrightvermerk von
|
meillo@9
|
176 David M. Ihnat aus dem Jahr 1984.
|
meillo@9
|
177
|
meillo@10
|
178 Trotz all dieser Jahreszahlen aus den 80er Jahren gehoert cut,
|
meillo@10
|
179 aus Sicht des urspruenglichen Unix, zu den juengeren Tools.
|
meillo@1
|
180 Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist,
|
meillo@4
|
181 so war Unix doch schon ueber zehn Jahre alt, als cut das
|
meillo@9
|
182 erste Mal auftauchte. Insbesondere gehoerte cut auch noch nicht
|
meillo@4
|
183 zu Version 7 Unix, das die Ausgangsbasis aller modernen
|
meillo@4
|
184 Unix-Systeme darstellt. Die weit komplexeren Programme sed
|
meillo@4
|
185 und awk waren dort schon vertreten. Man muss sich also
|
meillo@4
|
186 fragen, warum cut ueberhaupt noch entwickelt wurde, wo es
|
meillo@9
|
187 schon zwei Programme gab, die die Funktion von cut abdecken
|
meillo@9
|
188 konnten. Ein Argument fuer cut war sicher seine Kompaktheit und
|
meillo@4
|
189 die damit verbundene Geschwindigkeit gegenueber dem damals
|
meillo@4
|
190 traegen awk. Diese schlanke Gestalt ist es auch, die der Unix
|
meillo@4
|
191 Philosopie entspricht: Mache eine Aufgabe und die richtig!
|
meillo@9
|
192 Cut ueberzeugte. Es wurde in andere Unix Varianten uebernommen,
|
meillo@9
|
193 standardisiert und ist heutzutage ueberall anzutreffen.
|
meillo@1
|
194
|
meillo@9
|
195 Die urspruengliche Variante (ohne -b) wurde schon 1985 in
|
meillo@5
|
196 der System V Interface Definition, einer wichtigen formalen
|
meillo@9
|
197 Beschreibung von UNIX System V, spezifiziert und tauchte
|
meillo@9
|
198 anschliessend in allen relevanten Standards auf. Mit POSIX.2
|
meillo@9
|
199 im Jahre 1992 wurde cut zum ersten Mal in der heutigen Form
|
meillo@9
|
200 (mit -b) standardisiert.
|
meillo@9
|
201 XXX sicher? s.o.
|
meillo@1
|
202
|
meillo@1
|
203
|
meillo@9
|
204 Multibyte-Unterstuetzung
|
meillo@8
|
205
|
meillo@8
|
206 Nun sind der Bytemodus und die damit verbundene
|
meillo@8
|
207 Multibyte-Verarbeitung des POSIX-Zeichenmodus bereits seit
|
meillo@8
|
208 1992 standardisiert, wie steht es aber mit deren Umsetzung?
|
meillo@10
|
209 Welche Versionen implementieren POSIX korrekt?
|
meillo@9
|
210 Die Situation ist dreiteilig: Es gibt traditionelle
|
meillo@8
|
211 Implementierungen, die nur -c und -f kennen. Dann gibt es
|
meillo@10
|
212 Implementierungen die -b zwar kennen, es aber lediglich als Alias
|
meillo@8
|
213 fuer -c handhaben. Diese Implementierungen funktionieren mit
|
meillo@8
|
214 Single-Byte-Encodings (z.B. US-ASCII, Latin1) korrekt, bei
|
meillo@8
|
215 Multi-Byte-Encodings (z.B. UTF-8) verhaelt sich ihr -c aber
|
meillo@8
|
216 wie -b (und -n wird ignoriert). Schliesslich gibt es noch
|
meillo@8
|
217 Implementierungen, die -b und -c tatsaechlich POSIX-konform
|
meillo@8
|
218 implementieren.
|
meillo@8
|
219
|
meillo@8
|
220 Traditionelle Zwei-Modi-Implementierungen sind z.B. die von
|
meillo@8
|
221 System III, System V und die aller BSDs bis in die 90er.
|
meillo@8
|
222
|
meillo@10
|
223 Pseudo-Multibyte-Implementierungen bieten GNU und die
|
meillo@9
|
224 modernen NetBSDs und OpenBSDs. Wie sehr dort ein Schein von
|
meillo@9
|
225 POSIX-Konformitaet gewahrt wird, ist unterschiedlich. Nicht
|
meillo@8
|
226 immer findet man klare Aussagen wie diese:
|
meillo@8
|
227
|
meillo@8
|
228 /* Since we don't support multi-byte characters, the -c and -b
|
meillo@8
|
229 options are equivalent, and the -n option is meaningless. */
|
meillo@8
|
230
|
meillo@8
|
231 [ XXX
|
meillo@8
|
232
|
meillo@8
|
233 Tatsaechlich standardkonforme Implementierungen, die
|
meillo@8
|
234 Multibytes korrekt handhaben, bekommt man bei einem modernen
|
meillo@8
|
235 FreeBSD und bei den Heirloom Tools. Bei FreeBSD hat Tim Robbins
|
meillo@9
|
236 im Sommer 2004 den Zeichenmodus POSIX-konform reimplementiert.
|
meillo@8
|
237 [ https://svnweb.freebsd.org/base?view=revision&revision=131194
|
meillo@8
|
238 Warum die beiden anderen grossen BSDs diese Aenderung nicht
|
meillo@8
|
239 uebernommen haben, bleibt offen. Es scheint aber an der im
|
meillo@8
|
240 obigen Kommentar formulierten Grundausrichtung zu liegen.
|
meillo@8
|
241
|
meillo@8
|
242 Wie findet man als Nutzer heraus, ob beim cut(1) des eigenen
|
meillo@8
|
243 Systems Multibytes korrekt unterstuetzt werden? Zuerst ist
|
meillo@8
|
244 entscheidend, ob das System selbst mit einem Multibyte-Encoding
|
meillo@9
|
245 arbeitet, denn tut es das nicht, dann entsprechen sich naemlich
|
meillo@9
|
246 Zeichen und Bytes und die Frage eruebrigt sich. Man kann das
|
meillo@9
|
247 herausfinden indem man sich das Locale anschaut, aber einfacher
|
meillo@9
|
248 ist es, ein typisches Mehrbytezeichen, wie z.B. einen Umlaut,
|
meillo@9
|
249 auszugeben und zu schauen ob dieses in einem oder in mehreren
|
meillo@9
|
250 Bytes kodiert ist:
|
meillo@8
|
251
|
meillo@8
|
252 $ echo ä | od -c
|
meillo@8
|
253 0000000 303 244 \n
|
meillo@8
|
254 0000003
|
meillo@8
|
255
|
meillo@8
|
256 In diesem Fall sind es zwei Bytes: oktal 303 und 244 . (Den
|
meillo@8
|
257 Zeilenumbruch fuegt echo(1) hinzu.)
|
meillo@8
|
258
|
meillo@9
|
259 Mit dem Programm iconv(1) kann man Text explizit in bestimmte
|
meillo@10
|
260 Kodierungen konvertieren. Hier Beispiele, wie die Ausgabe
|
meillo@10
|
261 bei Latin1 und wie sie bei UTF-8 aussieht.
|
meillo@8
|
262
|
meillo@8
|
263 $ echo ä | iconv -t latin1 | od -c
|
meillo@8
|
264 0000000 344 \n
|
meillo@8
|
265 0000002
|
meillo@8
|
266
|
meillo@8
|
267 $ echo ä | iconv -t utf8 | od -c
|
meillo@8
|
268 0000000 303 244 \n
|
meillo@8
|
269 0000003
|
meillo@8
|
270
|
meillo@8
|
271 Die Ausgabe auf dem eigenen System (ohne die iconv-Konvertierung)
|
meillo@8
|
272 wird recht sicher einer dieser beiden Ausgaben entsprechen.
|
meillo@8
|
273
|
meillo@8
|
274 Nun zum Test der cut-Implementierung. Hat man ein UTF-8-System,
|
meillo@8
|
275 dann sollte sich eine POSIX-konforme Implementierung so verhalten:
|
meillo@8
|
276
|
meillo@10
|
277 $ echo ä | ./cut -c 1 | od -c
|
meillo@10
|
278 0000000 303 244 \n
|
meillo@8
|
279 0000003
|
meillo@8
|
280
|
meillo@10
|
281 $ echo ä | ./cut -b 1 | od -c
|
meillo@10
|
282 0000000 303 \n
|
meillo@8
|
283 0000002
|
meillo@8
|
284
|
meillo@10
|
285 $ echo ä | ./cut -b 1 -n | od -c
|
meillo@10
|
286 0000000 \n
|
meillo@10
|
287 0000001
|
meillo@10
|
288
|
meillo@10
|
289 Bei einer Pseudo-POSIX-Implementierung ist die Ausgabe in
|
meillo@10
|
290 allen drei Faellen wie die mittlere: Es wird das erste Byte
|
meillo@10
|
291 ausgegeben.
|
meillo@8
|
292
|
meillo@8
|
293
|
meillo@8
|
294 Implementierungen
|
meillo@8
|
295
|
meillo@9
|
296 Nun ein Blick auf den Code. Betrachtet wird eine Auswahl an
|
meillo@9
|
297 Implementierungen.
|
meillo@9
|
298
|
meillo@9
|
299 Fuer einen ersten Eindruck ist der Umfang des Quellcodes
|
meillo@9
|
300 hilfreich. Typischerweise steigt dieser ueber die Jahre an. Diese
|
meillo@8
|
301 Beobachtung kann hier in der Tendenz, aber nicht in jedem Fall,
|
meillo@9
|
302 bestaetigt werden. Die Unterstuetzung des Byte-Modus (-b)
|
meillo@9
|
303 erfordert zwangslaeufig mehr Code, deshalb sind die
|
meillo@9
|
304 POSIX-konformen Implementierungen tendenziell umfangreicher.
|
meillo@8
|
305
|
meillo@8
|
306
|
meillo@9
|
307 SLOC Zeilen Bytes Gehoert zu Dateidatum Kategorie
|
meillo@9
|
308 -----------------------------------------------------------------
|
meillo@9
|
309 116 123 2966 System III 1980-04-11 (trad)
|
meillo@9
|
310 118 125 3038 4.3BSD-UWisc 1986-11-07 (trad)
|
meillo@9
|
311 200 256 5715 4.3BSD-Reno 1990-06-25 (trad)
|
meillo@9
|
312 200 270 6545 NetBSD 1993-03-21 (trad)
|
meillo@9
|
313 218 290 6892 OpenBSD 2008-06-27 (pseudo)
|
meillo@9
|
314 224 296 6920 FreeBSD 1994-05-27 (trad)
|
meillo@9
|
315 232 306 7500 NetBSD 2014-02-03 (pseudo)
|
meillo@9
|
316 340 405 7423 Heirloom 2012-05-20 (POSIX)
|
meillo@9
|
317 382 586 14175 GNU coreutils 1992-11-08 (pseudo)
|
meillo@9
|
318 391 479 10961 FreeBSD 2012-11-24 (POSIX)
|
meillo@9
|
319 588 830 23167 GNU coreutils 2015-05-01 (pseudo)
|
meillo@9
|
320 XXX verlinken
|
meillo@8
|
321
|
meillo@8
|
322
|
meillo@9
|
323 Das Kandidatenfeld teilt sich grob in vier Gruppen: (1) Die zwei
|
meillo@9
|
324 urspruenglichen Implementierungen, die sich nur minimal
|
meillo@9
|
325 unterscheiden, mit gut 100 SLOCs. (2) Die fuenf BSD-Versionen mit
|
meillo@9
|
326 gut 200 SLOCs. (3) Die zwei POSIX-konformen Programme und
|
meillo@9
|
327 die alte GNU-Version mit 340-390 SLOCs. Und (4) die moderne
|
meillo@9
|
328 GNU-Variante mit fast 600 SLOCs.
|
meillo@8
|
329
|
meillo@9
|
330 Die Abweichung zwischen logischen Codezeilen (SLOC, ermittelt mit
|
meillo@9
|
331 SLOCcount) und der Anzahl von Zeilenumbruechen in der Datei (`wc
|
meillo@9
|
332 -l') erstreckt sich ueber einen Faktor von 1.06 bei den aeltesten
|
meillo@9
|
333 Vertretern bis zu Faktor 1.5 bei GNU. Der groesste
|
meillo@9
|
334 Einflussfaktor darauf sind Leerzeilen, reine Kommentarzeilen und
|
meillo@9
|
335 die Groesse des Lizenzblocks am Dateianfang.
|
meillo@8
|
336
|
meillo@9
|
337 Betrachtet man die Abweichungen zwischen den logischen Codezeilen
|
meillo@9
|
338 und der Dateigroesse (`wc -c'), so pendelt das Teilnehmerfeld
|
meillo@9
|
339 zwischen 25 und 30 Bytes je Anweisung. Die Heirloom-Implementierung
|
meillo@9
|
340 weicht mit nur 21 nach unten ab, die GNU-Implementierungen mit
|
meillo@10
|
341 fast 40 nach oben. Dies liegt bei GNU hauptsaechlich an deren
|
meillo@9
|
342 Programmierstil, mit spezieller Einrueckung und langen Bezeichnern.
|
meillo@9
|
343 Ob man die Heirloom-Implementierung als besonders kryptisch
|
meillo@9
|
344 oder als besonders elegant bezeichnen will, das soll der
|
meillo@9
|
345 eigenen Einschaetzung des Lesers ueberlassen bleiben.
|
meillo@8
|
346
|
meillo@8
|
347
|
meillo@9
|
348 Schaut man sich die SCCS-IDs (die vom damaligen
|
meillo@9
|
349 Versionskontrollsystem eingefuegt wurden) in den BSD-Quellen an,
|
meillo@9
|
350 dann findet man dort Versionsnummern, die die Entwicklung
|
meillo@9
|
351 dokumentieren:
|
meillo@8
|
352
|
meillo@9
|
353 4.3bsd-uwisc "@(#)cut.c 1.3";
|
meillo@9
|
354 4.3bsd-reno "@(#)cut.c 5.3 (Berkeley) 6/24/90";
|
meillo@9
|
355 netbsd "@(#)cut.c 5.4 (Berkeley) 10/30/90";
|
meillo@9
|
356 freebsd "@(#)cut.c 8.1 (Berkeley) 6/6/93";
|
meillo@8
|
357
|
meillo@8
|
358 Die neueren BSD-Versionen enthalten zwar weiterhin eine SCCS-ID, diese
|
meillo@8
|
359 ist aber bei Version "8.3 (Berkeley) 5/4/95" stehen geblieben. Danach
|
meillo@9
|
360 wurde scheinbar von SCCS auf ein anderes
|
meillo@9
|
361 Versionskontrollsystem gewechselt.
|
meillo@9
|
362 XXX
|
meillo@8
|
363
|
meillo@8
|
364 Bei GNU befindet sich folgender Copyright-Vermerk im Code:
|
meillo@8
|
365
|
meillo@9
|
366 Copyright (C) 1997-2015 Free Software Foundation, Inc.
|
meillo@9
|
367 Copyright (C) 1984 David M. Ihnat
|
meillo@8
|
368
|
meillo@9
|
369 Der Code hat also ziemlich alte Urspruenge. Wie aus weiteren
|
meillo@9
|
370 Kommentaren zu entnehmen ist, wurde der Code zuerst von David
|
meillo@9
|
371 MacKenzie und spaeter von Jim Meyering ueberarbeitet. Letzterer
|
meillo@9
|
372 hat den Code 1992 auch ins Versionkontrollsystem eingestellt.
|
meillo@9
|
373 Weshalb die Jahre zwischen 1992 und 1997 nicht im Copyright-Vermerk
|
meillo@9
|
374 auftauchen, ist unklar.
|
meillo@8
|
375
|
meillo@8
|
376
|
meillo@2
|
377 Beschreibungen
|
meillo@1
|
378
|
meillo@9
|
379 Interessant ist auch ein Vergleich der Kurzbeschreibungen von
|
meillo@9
|
380 cut, wie sie sich in der Titelzeile von Manpages oder manchmal
|
meillo@9
|
381 auch am Anfang der Quellcodedatei finden. Die folgende Liste
|
meillo@9
|
382 ist grob zeitlich geordnet und nach Abstammung gruppiert:
|
meillo@3
|
383
|
meillo@3
|
384
|
meillo@2
|
385 System III cut out selected fields of each line of a file
|
meillo@3
|
386 System III (src) cut and paste columns of a table (projection of a relation)
|
meillo@2
|
387 System V cut out selected fields of each line of a file
|
meillo@2
|
388 HP-UX cut out (extract) selected fields of each line of a file
|
meillo@2
|
389
|
meillo@3
|
390 4.3BSD-UWisc (src) cut and paste columns of a table (projection of a relation)
|
meillo@2
|
391 4.3BSD-Reno select portions of each line of a file
|
meillo@2
|
392 NetBSD select portions of each line of a file
|
meillo@7
|
393 OpenBSD 4.6 select portions of each line of a file
|
meillo@2
|
394 FreeBSD 1.0 select portions of each line of a file
|
meillo@10
|
395 FreeBSD 10.0 cut out selected portions of each line of a file
|
meillo@2
|
396 SunOS 4.1.3 remove selected fields from each line of a file
|
meillo@2
|
397 SunOS 5.5.1 cut out selected fields of each line of a file
|
meillo@2
|
398
|
meillo@8
|
399 Heirloom Tools cut out selected fields of each line of a file
|
meillo@9
|
400 Heirloom Tools (src) cut out fields of lines of files
|
meillo@2
|
401
|
meillo@2
|
402 GNU coreutils remove sections from each line of files
|
meillo@2
|
403
|
meillo@2
|
404 Minix select out columns of a file
|
meillo@2
|
405
|
meillo@2
|
406 Version 8 Unix rearrange columns of data
|
meillo@2
|
407 ``Unix Reader'' rearrange columns of text
|
meillo@2
|
408
|
meillo@9
|
409 POSIX cut out selected fields of each line of a file
|
meillo@2
|
410
|
meillo@9
|
411
|
meillo@9
|
412 Die mit ``(src)'' markierten Beschreibungen sind aus dem
|
meillo@9
|
413 jeweiligen Quellcode entnommen.
|
meillo@9
|
414 Der POSIX-Eintrag enthaelt die Beschreibung des Standards.
|
meillo@9
|
415 Der ``Unix Reader'' ist ein rueckblickendes Textdokument von
|
meillo@5
|
416 Doug McIlroy, das das Auftreten von Tools in der Geschichte
|
meillo@9
|
417 des Research Unix zum Thema hat.
|
meillo@9
|
418 [ XXX
|
meillo@9
|
419 Eigentlich sollte seine
|
meillo@9
|
420 Beschreibung der in Version 8 Unix entsprechen. Die
|
meillo@9
|
421 Abweichung koennte sowohl ein Uebertragungsfehler als auch
|
meillo@9
|
422 eine nachtraegliche Korrektur sein.
|
meillo@9
|
423 Alle uebrigen Beschreibungen entstammen den Manpages.
|
meillo@5
|
424
|
meillo@9
|
425 Oft ist mit der Zeit die POSIX-Beschreibung uebernommen
|
meillo@5
|
426 worden, wie beispielsweise bei FreeBSD zu sehen.
|
meillo@5
|
427 [ https://svnweb.freebsd.org/base?view=revision&revision=167101
|
meillo@9
|
428 XXX fixme!
|
meillo@5
|
429
|
meillo@7
|
430 Interessant ist, dass die GNU coreutils seit Anbeginn vom
|
meillo@5
|
431 Entfernen von Teilen der Eingabe sprechen, wohingegen die
|
meillo@5
|
432 Kommandozeilenangabe klar ein Auswaehlen darstellt. Die
|
meillo@10
|
433 Worte ``cut out'' sind vielleicht auch nur etwas zu
|
meillo@9
|
434 missverstaendlich. HP-UX hat sie deshalb praezisiert.
|
meillo@5
|
435
|
meillo@10
|
436 Auch beim Begriff, was selektiert wird, ist man sich
|
meillo@5
|
437 uneins. Die einen reden von Feldern (POSIX), andere von
|
meillo@5
|
438 Abschnitten bzw. Teilen (BSD) und wieder andere von Spalten
|
meillo@5
|
439 (Research Unix). Ironischerweise leistet sich gerade Version
|
meillo@5
|
440 8 Unix, das eigentlich um eine sehr treffende Weltsicht
|
meillo@5
|
441 bemueht ist, mit ``rearrange columns of data'' die
|
meillo@5
|
442 unzutreffendste der Beschreibungen.
|
meillo@5
|
443
|
meillo@5
|
444
|
meillo@6
|
445 Autoreninfo
|
meillo@6
|
446
|
meillo@6
|
447 Markus Schnalke interessiert sich fuer die Hintergruende
|
meillo@6
|
448 von Unix und seinen Werkzeugen. Fuer die Erarbeitung dieses
|
meillo@6
|
449 Textes wurde er regelrecht zum Historiker.
|
meillo@6
|
450
|
meillo@6
|
451
|
meillo@6
|
452 Lizenz
|
meillo@10
|
453
|
meillo@6
|
454 CC0 (und kann damit auch unter CC BY-SA 4.0 Unported
|
meillo@6
|
455 veroeffentlicht werden)
|