comparison cut.txt @ 9:e67bd0d48bd6

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