Mercurial > docs > cut
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. |