Mercurial > docs > cut
comparison cut.txt @ 17:08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Wed, 13 May 2015 07:18:16 +0200 |
parents | 4d8196c836d8 |
children | b1e7b45fb3c8 |
comparison
equal
deleted
inserted
replaced
16:4d8196c836d8 | 17:08f539a5445d |
---|---|
45 `$long' aus. (Alternativ kann man hierfuer `printf | 45 `$long' aus. (Alternativ kann man hierfuer `printf |
46 "%.10s\n" "$long"' verwenden.) | 46 "%.10s\n" "$long"' verwenden.) |
47 | 47 |
48 Geht es aber nicht um die Darstellung von Zeichen, sondern um | 48 Geht es aber nicht um die Darstellung von Zeichen, sondern um |
49 ihre Speicherung, dann ist `-c' nicht unbedingt geeignet. | 49 ihre Speicherung, dann ist `-c' nicht unbedingt geeignet. |
50 Frueher, als US-ASCII als Zeichensatz und -kodierung | 50 Frueher, als US-ASCII noch die omnipraesente Zeichenkodierung |
51 noch omnipraesent war, wurde jedes Zeichen mit genau einem | 51 war, wurde jedes Zeichen mit genau einem |
52 Byte gespeichert. Somit selektierte `cut -c' gleichermassen | 52 Byte gespeichert. Somit selektierte `cut -c' gleichermassen |
53 sowohl Ausgabezeichen als auch Bytes. Mit dem Aufkommen von | 53 sowohl Ausgabezeichen als auch Bytes. Mit dem Aufkommen von |
54 Multibyte-Kodierungen (wie UTF-8) musste man sich jedoch von | 54 Multibyte-Kodierungen (wie UTF-8) musste man sich jedoch von |
55 dieser Annahme loesen. In diesem Zug bekam cut mit | 55 dieser Annahme loesen. In diesem Zug bekam cut mit |
56 POSIX.2-1992 einen Bytemodus (Option `-b'). Will man | 56 POSIX.2-1992 einen Bytemodus (Option `-b'). Will man |
63 Den Rest kann man sich mit `cut -b 501-' einfangen. Diese | 63 Den Rest kann man sich mit `cut -b 501-' einfangen. Diese |
64 Funktion ist insbesondere fuer POSIX wichtig, da man so | 64 Funktion ist insbesondere fuer POSIX wichtig, da man so |
65 Textdateien mit begrenzter Zeilenlaenge erzeugen kann. | 65 Textdateien mit begrenzter Zeilenlaenge erzeugen kann. |
66 [ http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html#tag_20_28_17 | 66 [ http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html#tag_20_28_17 |
67 | 67 |
68 Auch wenn der Bytemodus neu eingefuehrt wurde, so sollte er | 68 Wenn auch der Bytemodus neu eingefuehrt worden war, so sollte |
69 sich doch nur so verhalten wie der alte Zeichenmodus normalerweise | 69 er sich doch nur so verhalten wie der alte Zeichenmodus |
70 implementiert war. Beim Zeichenmodus aber wurde durch POSIX.2 | 70 normalerweise schon implementiert war. Beim Zeichenmodus aber |
71 eine andere Implementierungsweise gefordert. Das Problem war | 71 wurde eine neue Implementierungsweise gefordert. Das Problem |
72 also nicht, den neuen Bytemodus zu implementieren, sondern | 72 war also nicht, den neuen Bytemodus zu implementieren, sondern |
73 den Zeichenmodus neu zu implementieren. | 73 den Zeichenmodus neu zu implementieren. |
74 | 74 |
75 Neben dem Zeichen- und Byte-Modus bietet cut noch den | 75 Neben dem Zeichen- und Bytemodus bietet cut noch den |
76 Feld-Modus, den man mit `-f' einleitet. Mit ihm | 76 Feldmodus, den man mit `-f' einleitet. Mit ihm |
77 koennen Felder ausgewaehlt werden. Das Trennzeichen (per | 77 koennen Felder ausgewaehlt werden. Das Trennzeichen (per |
78 Default der Tab) kann mit `-d' geaendert werden. | 78 Default der Tab) kann mit `-d' geaendert werden. |
79 | 79 |
80 Der typische Anwendungsfall fuer cut im Feld-Modus ist die | 80 Der typische Anwendungsfall fuer cut im Feldmodus ist die |
81 Auswahl von Information aus der passwd-Datei. So z.B. der | 81 Auswahl von Information aus der passwd-Datei. So z.B. der |
82 Benutzername, seine ID und das Homeverzeichnis: | 82 Benutzername und seine ID: |
83 | 83 |
84 $ cut -d: -f1,3,6 /etc/passwd | 84 $ cut -d: -f1,3 /etc/passwd |
85 root:0:/root | 85 root:0 |
86 bin:1:/bin | 86 bin:1 |
87 daemon:2:/sbin | 87 daemon:2 |
88 mail:8:/var/spool/mail | 88 mail:8 |
89 ... | 89 ... |
90 | 90 |
91 (Die Argumente fuer die Optionen koennen bei cut uebrigens | 91 (Die Argumente fuer die Optionen koennen bei cut uebrigens |
92 mit Whitespace abgetrennt oder direkt angehaengt folgen.) | 92 mit Whitespace abgetrennt oder direkt angehaengt folgen.) |
93 | 93 |
94 Dieser Feld-Modus ist fuer einfache tabellarische Dateien, | 94 Dieser Feldmodus ist fuer einfache tabellarische Dateien, |
95 wie eben die passwd, gut geeignet. Er kommt aber schnell an | 95 wie eben die passwd, gut geeignet. Er kommt aber schnell an |
96 seine Grenzen. Gerade der haeufige Fall, dass an Whitespace | 96 seine Grenzen. Gerade der haeufige Fall, dass an Whitespace |
97 in Felder geteilt werden soll, wird damit nicht abgedeckt. | 97 in Felder geteilt werden soll, wird damit nicht abgedeckt. |
98 Der Delimiter kann nur genau ein Zeichen sein. Es kann also | 98 Der Delimiter kann bei cut nur genau ein Zeichen sein. Es kann |
99 nicht sowohl an Leerzeichen als auch an Tabs getrennt werden. | 99 also nicht sowohl an Leerzeichen als auch an Tabs aufgetrennt |
100 Auch unterteilt cut an jedem Trennzeichen. Zwei aneinander | 100 werden. Auch unterteilt cut an jedem Trennzeichen. Zwei aneinander |
101 stehende Trennzeichen fuehren zu einem leeren Feld. Dieses | 101 stehende Trennzeichen fuehren zu einem leeren Feld. Dieses |
102 Verhalten widerspricht den Erwartungen, die man an die | 102 Verhalten widerspricht den Erwartungen, die man an die |
103 Verarbeitung einer Datei mit Whitespace-getrennten Feldern | 103 Verarbeitung einer Datei mit Whitespace-getrennten Feldern |
104 hat. Manche Implementierungen von cut, z.B. die von FreeBSD, | 104 hat. Manche Implementierungen von cut, z.B. die von FreeBSD, |
105 haben aber Erweiterungen, die das gewuenschte Verhalten fuer | 105 haben deshalb Erweiterungen, die das gewuenschte Verhalten |
106 Whitespace-getrennte Felder bieten. Ansonsten, d.h. wenn | 106 fuer Whitespace-getrennte Felder bieten. Ansonsten, d.h. wenn |
107 man portabel bleiben will, verwendet man awk in diesen | 107 man portabel bleiben will, verwendet man awk in diesen |
108 Faellen. | 108 Faellen. |
109 | 109 |
110 Awk bietet noch eine weitere Funktion, die cut missen | 110 Awk bietet noch eine weitere Funktion, die cut missen |
111 laesst: Das Tauschen der Feld-Reihenfolge in der Ausgabe. Bei | 111 laesst: Das Tauschen der Feld-Reihenfolge in der Ausgabe. Bei |
138 Licht der oeffentlichen Welt. Wenn man die Quellen von System | 138 Licht der oeffentlichen Welt. Wenn man die Quellen von System |
139 III durchforstet, findet man die Quellcodedatei cut.c mit dem | 139 III durchforstet, findet man die Quellcodedatei cut.c mit dem |
140 Zeitstempel 1980-04-11. | 140 Zeitstempel 1980-04-11. |
141 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/cmd | 141 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/cmd |
142 Das ist die aelteste Manifestation des Programms, die ich | 142 Das ist die aelteste Manifestation des Programms, die ich |
143 aufstoebern konnte. Allerdings spricht die sccsid im | 143 aufstoebern konnte. Allerdings spricht die SCCS-ID im |
144 Quellcode von Version 1.5. Es muss also noch eine | 144 Quellcode von Version 1.5. Es muss also noch eine |
145 Vorgeschichte geben. Zu dieser habe ich leider keinen Zugang | 145 Vorgeschichte geben. Zu dieser habe ich leider keinen Zugang |
146 gefunden. | 146 gefunden. |
147 XXX mail an TUHS | 147 XXX mail an TUHS |
148 | 148 |
149 Nun ein Blick auf die BSD-Linie: Dort ist mein | 149 Nun ein Blick auf die BSD-Linie: Dort ist mein fruehester |
150 fruehester Fund ein cut.c mit dem Dateimodifikationsdatum | 150 Fund ein cut.c mit dem Dateimodifikationsdatum 1986-11-07 |
151 1986-11-07 | |
152 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-UWisc/src/usr.bin/cut | 151 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-UWisc/src/usr.bin/cut |
153 als Teil der Spezialversion 4.3BSD-UWisc, | 152 als Teil der Spezialversion 4.3BSD-UWisc, |
154 [ http://gunkies.org/wiki/4.3_BSD_NFS_Wisconsin_Unix | 153 [ http://gunkies.org/wiki/4.3_BSD_NFS_Wisconsin_Unix |
155 die im Januar 1987 veroeffentlicht wurde. | 154 die im Januar 1987 veroeffentlicht wurde. |
156 Die Implementierung unterscheidet sich nur minimal von der | 155 Die Implementierung unterscheidet sich nur minimal von der |
157 in System III. | 156 in System III. |
158 Im bekannteren 4.3BSD-Tahoe (1988) taucht cut nicht auf. | 157 Im bekannteren 4.3BSD-Tahoe (1988) tauchte cut nicht auf. |
159 Das darauf folgende 4.3BSD-Reno (1990) liefert aber wieder | 158 Das darauf folgende 4.3BSD-Reno (1990) lieferte aber wieder |
160 ein cut mit aus. Dieses cut ist ein von Adam S. Moskowitz und | 159 ein cut mit aus. Dieses cut war ein von Adam S. Moskowitz und |
161 Marciano Pitargue neu implementiertes cut, das 1989 in BSD | 160 Marciano Pitargue neu implementiertes cut, das 1989 in BSD |
162 aufgenommen wurde. | 161 aufgenommen wurde. |
163 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut | 162 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut |
164 Seine Manpage | 163 Seine Manpage |
165 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut/cut.1 | 164 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut/cut.1 |
166 erwaehnt bereits die erwartete Konformitaet mit POSIX.2. | 165 erwaehnt bereits die erwartete Konformitaet mit POSIX.2. |
167 XXX 2 oder 3 modi? Draft 9: 2 modi? Draft 11.2 hat 3 modi! | 166 Nun muss man wissen, dass POSIX.2 erst im September |
168 Nun sollte man wissen, dass POSIX.2 erst im September | |
169 1992 veroeffentlicht wurde, also gut zwei Jahren nachdem die | 167 1992 veroeffentlicht wurde, also gut zwei Jahren nachdem die |
170 Manpage und das Programm geschrieben wurden. Das Programm | 168 Manpage und das Programm geschrieben worden waren. Das Programm |
171 wurde folglich anhand von Arbeitsversionen des Standards | 169 wurde folglich anhand von Arbeitsversionen des Standards |
172 implementiert. Ein Blick in den Code bekraeftigt diese Vermutung. | 170 implementiert. Ein Blick in den Code bekraeftigt diese Vermutung. |
173 In der Funktion zum parsen der Feldauswahlliste findet sich | 171 In der Funktion zum parsen der Feldauswahlliste findet sich |
174 dieser Kommentar: | 172 dieser Kommentar: |
175 | 173 |
181 ein: | 179 ein: |
182 | 180 |
183 The elements in list can be repeated, can overlap, and can | 181 The elements in list can be repeated, can overlap, and can |
184 be specified in any order. | 182 be specified in any order. |
185 | 183 |
186 Die Versionsnummern und Aenderungsdatums der aelteren | 184 Auch listet Draft 11.2 alle drei Modi, waehrend in diesem |
187 BSD-Implementierungen kann man aus den SCCS-IDs (die vom | 185 BSD cut nur die zwei alten implementiert sind. Es koennte also |
188 damaligen Versionskontrollsystem in den Code eingefuegt wurden) | 186 sein, dass in Draft 9 der Bytemodus noch nicht vorhanden war. |
187 Da ich keinen Zugang zu Draft 9 oder 10 finden konnte, war es mir | |
188 leider nicht moeglich, diese Vermutung zu pruefen. XXX | |
189 | |
190 Die Versionsnummern und Aenderungsdaten der aelteren | |
191 BSD-Implementierungen kann man aus den SCCS-IDs, die vom | |
192 damaligen Versionskontrollsystem in den Code eingefuegt wurden, | |
189 ablesen. So z.B. bei 4.3BSD-Reno: ``5.3 (Berkeley) 6/24/90''. | 193 ablesen. So z.B. bei 4.3BSD-Reno: ``5.3 (Berkeley) 6/24/90''. |
190 | 194 |
191 Das cut der GNU Coreutils enthaelt folgenden Copyrightvermerk: | 195 Das cut der GNU Coreutils enthaelt folgenden Copyrightvermerk: |
192 | 196 |
193 Copyright (C) 1997-2015 Free Software Foundation, Inc. | 197 Copyright (C) 1997-2015 Free Software Foundation, Inc. |
194 Copyright (C) 1984 David M. Ihnat | 198 Copyright (C) 1984 David M. Ihnat |
195 | 199 |
196 Der Code hat also ziemlich alte Urspruenge. Wie aus weiteren | 200 Der Code hat also recht alte Urspruenge. Wie aus weiteren |
197 Kommentaren zu entnehmen ist, wurde der Code zuerst von David | 201 Kommentaren zu entnehmen ist, wurde der Programmcode zuerst von David |
198 MacKenzie und spaeter von Jim Meyering ueberarbeitet. Letzterer | 202 MacKenzie und spaeter von Jim Meyering ueberarbeitet. Letzterer |
199 hat den Code 1992 auch ins Versionkontrollsystem eingestellt. | 203 hat den Code 1992 auch ins Versionkontrollsystem eingestellt. |
200 Weshalb die Jahre zwischen 1992 und 1997 nicht im Copyright-Vermerk | 204 Weshalb die Jahre vor 1997, zumindest ab 1992, nicht im |
201 auftauchen, ist unklar. | 205 Copyright-Vermerk auftauchen, ist unklar. |
202 | 206 |
203 Trotz der vielen Jahreszahlen aus den 80er Jahren gehoert cut, | 207 Trotz der vielen Jahreszahlen aus den 80er Jahren gehoert cut, |
204 aus Sicht des urspruenglichen Unix, zu den juengeren Tools. | 208 aus Sicht des urspruenglichen Unix, zu den juengeren Tools. |
205 Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist, | 209 Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist, |
206 so war Unix doch schon ueber zehn Jahre alt, als cut das | 210 so war Unix doch schon ueber zehn Jahre alt, als cut das |
210 und awk waren dort schon vertreten. Man muss sich also | 214 und awk waren dort schon vertreten. Man muss sich also |
211 fragen, warum cut ueberhaupt noch entwickelt wurde, wo es | 215 fragen, warum cut ueberhaupt noch entwickelt wurde, wo es |
212 schon zwei Programme gab, die die Funktion von cut abdecken | 216 schon zwei Programme gab, die die Funktion von cut abdecken |
213 konnten. Ein Argument fuer cut war sicher seine Kompaktheit und | 217 konnten. Ein Argument fuer cut war sicher seine Kompaktheit und |
214 die damit verbundene Geschwindigkeit gegenueber dem damals | 218 die damit verbundene Geschwindigkeit gegenueber dem damals |
215 traegen awk. Diese schlanke Gestalt ist es auch, die der Unix | 219 traegen awk. Diese schlanke Gestalt ist es auch, die der |
216 Philosopie entspricht: Mache eine Aufgabe und die richtig! | 220 Unix-Philosopie entspricht: Mache eine Aufgabe und die richtig! |
217 Cut ueberzeugte. Es wurde in andere Unix Varianten uebernommen, | 221 Cut ueberzeugte. Es wurde in andere Unix Varianten uebernommen, |
218 standardisiert und ist heutzutage ueberall anzutreffen. | 222 standardisiert und ist heutzutage ueberall anzutreffen. |
219 | 223 |
220 Die urspruengliche Variante (ohne -b) wurde schon 1985 in | 224 Die urspruengliche Variante (ohne -b) wurde schon 1985 in |
221 der System V Interface Definition, einer wichtigen formalen | 225 der System V Interface Definition, einer wichtigen formalen |
230 | 234 |
231 Nun sind der Bytemodus und die damit verbundene | 235 Nun sind der Bytemodus und die damit verbundene |
232 Multibyte-Verarbeitung des POSIX-Zeichenmodus bereits seit | 236 Multibyte-Verarbeitung des POSIX-Zeichenmodus bereits seit |
233 1992 standardisiert, wie steht es aber mit deren Umsetzung? | 237 1992 standardisiert, wie steht es aber mit deren Umsetzung? |
234 Welche Versionen implementieren POSIX korrekt? | 238 Welche Versionen implementieren POSIX korrekt? |
235 Die Situation ist dreiteilig: Es gibt traditionelle | 239 Die Situation ist dreiteilig: Es gibt historische |
236 Implementierungen, die nur -c und -f kennen. Dann gibt es | 240 Implementierungen, die nur -c und -f kennen. Dann gibt es |
237 Implementierungen die -b zwar kennen, es aber lediglich als Alias | 241 Implementierungen die -b zwar kennen, es aber lediglich als Alias |
238 fuer -c handhaben. Diese Implementierungen funktionieren mit | 242 fuer -c handhaben. Diese Implementierungen funktionieren mit |
239 Single-Byte-Encodings (z.B. US-ASCII, Latin1) korrekt, bei | 243 Single-Byte-Encodings (z.B. US-ASCII, Latin1) korrekt, bei |
240 Multi-Byte-Encodings (z.B. UTF-8) verhaelt sich ihr -c aber | 244 Multibyte-Encodings (z.B. UTF-8) verhaelt sich ihr -c aber |
241 wie -b (und -n wird ignoriert). Schliesslich gibt es noch | 245 wie -b (und -n wird ignoriert). Schliesslich gibt es noch |
242 Implementierungen, die -b und -c tatsaechlich POSIX-konform | 246 Implementierungen, die -b und -c tatsaechlich POSIX-konform |
243 implementieren. | 247 implementieren. |
244 | 248 |
245 Traditionelle Zwei-Modi-Implementierungen sind z.B. die von | 249 Historische Zwei-Modi-Implementierungen sind z.B. die von |
246 System III, System V und die aller BSDs bis in die 90er. | 250 System III, System V und die aller BSDs bis in die 90er. |
247 | 251 |
248 Pseudo-Multibyte-Implementierungen bieten GNU und die | 252 Pseudo-Multibyte-Implementierungen bieten GNU und die |
249 modernen NetBSDs und OpenBSDs. Man darf sich durchaus fragen, | 253 modernen NetBSDs und OpenBSDs. Man darf sich sicher fragen, |
250 ob dort ein Schein von POSIX-Konformitaet gewahrt wird. | 254 ob dort ein Schein von POSIX-Konformitaet gewahrt wird. |
251 Teilweise findet man erst nach genauerer Suche heraus, dass | 255 Teilweise findet man erst nach genauerer Suche heraus, dass |
252 -c und -n nicht wie erwartet funktionieren; teilweise machen es | 256 -c und -n nicht wie erwartet funktionieren; teilweise machen es |
253 sich die System auch einfach, indem sie auf | 257 sich die Systeme auch einfach, indem sie auf |
254 Singlebyte-Zeichenkodierungen beharren, das aber dafuer klar | 258 Singlebyte-Zeichenkodierungen beharren, das aber dafuer meist |
255 darlegen: | 259 klar darlegen: |
256 | 260 |
257 Since we don't support multi-byte characters, the -c and -b | 261 Since we don't support multi-byte characters, the -c and -b |
258 options are equivalent, and the -n option is meaningless. | 262 options are equivalent, and the -n option is meaningless. |
259 | 263 |
260 [ http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/cut/cut.c?rev=1.18&content-type=text/x-cvsweb-markup | 264 [ http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/cut/cut.c?rev=1.18&content-type=text/x-cvsweb-markup |
266 [ https://svnweb.freebsd.org/base?view=revision&revision=131194 | 270 [ https://svnweb.freebsd.org/base?view=revision&revision=131194 |
267 Warum die beiden anderen grossen BSDs diese Aenderung nicht | 271 Warum die beiden anderen grossen BSDs diese Aenderung nicht |
268 uebernommen haben, bleibt offen. Es scheint aber an der im | 272 uebernommen haben, bleibt offen. Es scheint aber an der im |
269 obigen Kommentar formulierten Grundausrichtung zu liegen. | 273 obigen Kommentar formulierten Grundausrichtung zu liegen. |
270 | 274 |
271 Wie findet man als Nutzer heraus, ob beim cut(1) des eigenen | 275 Wie findet man nun als Nutzer heraus, ob beim cut(1) des eigenen |
272 Systems Multibytes korrekt unterstuetzt werden? Zuerst ist | 276 Systems Multibytes korrekt unterstuetzt werden? Zuerst ist |
273 entscheidend, ob das System selbst mit einem Multibyte-Encoding | 277 entscheidend, ob das System selbst mit einem Multibyte-Encoding |
274 arbeitet, denn tut es das nicht, dann entsprechen sich naemlich | 278 arbeitet, denn tut es das nicht, dann entsprechen sich |
275 Zeichen und Bytes und die Frage eruebrigt sich. Man kann das | 279 Zeichen und Bytes und die Frage eruebrigt sich. Man kann das |
276 herausfinden indem man sich das Locale anschaut, aber einfacher | 280 herausfinden indem man sich das Locale anschaut, aber einfacher |
277 ist es, ein typisches Mehrbytezeichen, wie z.B. einen Umlaut, | 281 ist es, ein typisches Mehrbytezeichen, wie z.B. einen Umlaut, |
278 auszugeben und zu schauen ob dieses in einem oder in mehreren | 282 auszugeben und zu schauen ob dieses in einem oder in mehreren |
279 Bytes kodiert ist: | 283 Bytes kodiert ist: |
299 | 303 |
300 Die Ausgabe auf dem eigenen System (ohne die iconv-Konvertierung) | 304 Die Ausgabe auf dem eigenen System (ohne die iconv-Konvertierung) |
301 wird recht sicher einer dieser beiden Ausgaben entsprechen. | 305 wird recht sicher einer dieser beiden Ausgaben entsprechen. |
302 | 306 |
303 Nun zum Test der cut-Implementierung. Hat man ein UTF-8-System, | 307 Nun zum Test der cut-Implementierung. Hat man ein UTF-8-System, |
304 dann sollte sich eine POSIX-konforme Implementierung so verhalten: | 308 dann sollte sich eine POSIX-konforme Implementierung folgendermassen |
309 verhalten: | |
305 | 310 |
306 $ echo ä | ./cut -c 1 | od -c | 311 $ echo ä | ./cut -c 1 | od -c |
307 0000000 303 244 \n | 312 0000000 303 244 \n |
308 0000003 | 313 0000003 |
309 | 314 |
326 Implementierungen. | 331 Implementierungen. |
327 | 332 |
328 Fuer einen ersten Eindruck ist der Umfang des Quellcodes | 333 Fuer einen ersten Eindruck ist der Umfang des Quellcodes |
329 hilfreich. Typischerweise steigt dieser ueber die Jahre an. Diese | 334 hilfreich. Typischerweise steigt dieser ueber die Jahre an. Diese |
330 Beobachtung kann hier in der Tendenz, aber nicht in jedem Fall, | 335 Beobachtung kann hier in der Tendenz, aber nicht in jedem Fall, |
331 bestaetigt werden. Die Unterstuetzung des Byte-Modus (-b) | 336 bestaetigt werden. Die POSIX-konforme Umsetzung des Zeichenmodus |
332 erfordert zwangslaeufig mehr Code, deshalb sind die | 337 erfordert zwangslaeufig mehr Code, deshalb sind diese |
333 POSIX-konformen Implementierungen tendenziell umfangreicher. | 338 Implementierungen tendenziell umfangreicher. |
334 | 339 |
335 | 340 |
336 SLOC Zeilen Bytes Gehoert zu Dateidatum Kategorie | 341 SLOC Zeilen Bytes Gehoert zu Dateidatum Kategorie |
337 ----------------------------------------------------------------- | 342 ----------------------------------------------------------------- |
338 116 123 2966 System III 1980-04-11 (trad) | 343 116 123 2966 System III 1980-04-11 (hist) |
339 118 125 3038 4.3BSD-UWisc 1986-11-07 (trad) | 344 118 125 3038 4.3BSD-UWisc 1986-11-07 (hist) |
340 200 256 5715 4.3BSD-Reno 1990-06-25 (trad) | 345 200 256 5715 4.3BSD-Reno 1990-06-25 (hist) |
341 200 270 6545 NetBSD 1993-03-21 (trad) | 346 200 270 6545 NetBSD 1993-03-21 (hist) |
342 218 290 6892 OpenBSD 2008-06-27 (pseudo) | 347 218 290 6892 OpenBSD 2008-06-27 (pseudo) |
343 224 296 6920 FreeBSD 1994-05-27 (trad) | 348 224 296 6920 FreeBSD 1994-05-27 (hist) |
344 232 306 7500 NetBSD 2014-02-03 (pseudo) | 349 232 306 7500 NetBSD 2014-02-03 (pseudo) |
345 340 405 7423 Heirloom 2012-05-20 (POSIX) | 350 340 405 7423 Heirloom 2012-05-20 (POSIX) |
346 382 586 14175 GNU coreutils 1992-11-08 (pseudo) | 351 382 586 14175 GNU coreutils 1992-11-08 (pseudo) |
347 391 479 10961 FreeBSD 2012-11-24 (POSIX) | 352 391 479 10961 FreeBSD 2012-11-24 (POSIX) |
348 588 830 23167 GNU coreutils 2015-05-01 (pseudo) | 353 588 830 23167 GNU coreutils 2015-05-01 (pseudo) |
350 | 355 |
351 Das Kandidatenfeld teilt sich grob in vier Gruppen: (1) Die zwei | 356 Das Kandidatenfeld teilt sich grob in vier Gruppen: (1) Die zwei |
352 urspruenglichen Implementierungen, die sich nur minimal | 357 urspruenglichen Implementierungen, die sich nur minimal |
353 unterscheiden, mit gut 100 SLOCs. (2) Die fuenf BSD-Versionen mit | 358 unterscheiden, mit gut 100 SLOCs. (2) Die fuenf BSD-Versionen mit |
354 gut 200 SLOCs. (3) Die zwei POSIX-konformen Programme und | 359 gut 200 SLOCs. (3) Die zwei POSIX-konformen Programme und |
355 die alte GNU-Version mit 340-390 SLOCs. Und (4) die moderne | 360 die alte GNU-Version mit 340-390 SLOCs. Und schliesslich (4) die |
356 GNU-Variante mit fast 600 SLOCs. | 361 moderne GNU-Variante mit fast 600 SLOCs. |
357 | 362 |
358 Die Abweichung zwischen logischen Codezeilen (SLOC, ermittelt mit | 363 Die Abweichung zwischen logischen Codezeilen (SLOC, ermittelt mit |
359 SLOCcount) und der Anzahl von Zeilenumbruechen in der Datei (`wc | 364 SLOCcount) und der Anzahl von Zeilenumbruechen in der Datei (`wc |
360 -l') erstreckt sich ueber einen Faktor von 1.06 bei den aeltesten | 365 -l') erstreckt sich ueber einen Faktor von 1.06 bei den aeltesten |
361 Vertretern bis zu Faktor 1.5 bei GNU. Der groesste | 366 Vertretern bis zu Faktor 1.5 bei GNU. Der groesste |
364 | 369 |
365 Betrachtet man die Abweichungen zwischen den logischen Codezeilen | 370 Betrachtet man die Abweichungen zwischen den logischen Codezeilen |
366 und der Dateigroesse (`wc -c'), so pendelt das Teilnehmerfeld | 371 und der Dateigroesse (`wc -c'), so pendelt das Teilnehmerfeld |
367 zwischen 25 und 30 Bytes je Anweisung. Die Heirloom-Implementierung | 372 zwischen 25 und 30 Bytes je Anweisung. Die Heirloom-Implementierung |
368 weicht mit nur 21 nach unten ab, die GNU-Implementierungen mit | 373 weicht mit nur 21 nach unten ab, die GNU-Implementierungen mit |
369 fast 40 nach oben. Dies liegt bei GNU hauptsaechlich an deren | 374 fast 40 nach oben. Bei GNU liegt dies hauptsaechlich an deren |
370 Programmierstil, mit spezieller Einrueckung und langen Bezeichnern. | 375 Programmierstil, mit spezieller Einrueckung und langen Bezeichnern. |
371 Ob man die Heirloom-Implementierung als besonders kryptisch | 376 Ob man die Heirloom-Implementierung als besonders kryptisch |
372 oder als besonders elegant bezeichnen will, das soll der | 377 oder als besonders elegant bezeichnen will, das soll der |
373 eigenen Einschaetzung des Lesers ueberlassen bleiben. | 378 eigenen Einschaetzung des Lesers ueberlassen bleiben. |
374 | 379 |
375 | 380 |
376 Die interne Struktur des C-Codes ist meist aehnlich. Neben der | 381 Die interne Struktur der Programmcodes (in C) ist meist aehnlich. |
377 obligatorischen main-Funktion, die die Kommandozeilenargumente | 382 Neben der obligatorischen main-Funktion, die die Kommandozeilenargumente |
378 verarbeitet, gibt es im Normalfall eine Funktion, die die | 383 verarbeitet, gibt es im Normalfall eine Funktion, die die |
379 Feldauswahl in eine interne Datenstruktur ueberfuehrt. Desweiteren | 384 Feldauswahl in eine interne Datenstruktur ueberfuehrt. Desweiteren |
380 haben fast alle Implementierungen separate Funktionen fuer die | 385 haben fast alle Implementierungen separate Funktionen fuer die |
381 zwei bzw. drei Modi. Bei den POSIX-konformen Implementierungen | 386 zwei bzw. drei Modi. Bei den POSIX-konformen Implementierungen |
382 wird die `-b -n'-Kombination als weiterer Modus behandelt, und | 387 wird die `-b -n'-Kombination als weiterer Modus behandelt, und |
383 damit in einer eigenen Funktion umgesetzt. Nur bei der fruehen | 388 damit in einer eigenen Funktion umgesetzt. Nur bei der fruehen |
384 System III-Implementierung (und seiner 4.3BSD-UWisc-Variante) | 389 System III-Implementierung (und seiner 4.3BSD-UWisc-Variante) |
385 wird ausser den Fehlerausgaben nichts aus der main-Funktion | 390 wird ausser den Fehlerausgaben alles in der main-Funktion |
386 ausgelagert. | 391 erledigt. |
387 | 392 |
388 Cut-Implementierungen haben typischerweise zwei limitierende | 393 Cut-Implementierungen haben typischerweise zwei limitierende |
389 Groessen: Die Maximalanzahl unterstuetzter Felder und die maximale | 394 Groessen: Die Maximalanzahl unterstuetzter Felder und die maximale |
390 Zeilenlaenge. Bei System III ist die Anzahl der moeglichen Felder | 395 Zeilenlaenge. Bei System III sind beide Groessen auf 512 begrenzt. |
391 und ebenso die Zeilenlaenge auf 512 begrenzt. 4.3BSD-Reno und die | 396 4.3BSD-Reno und die BSDs der 90er Jahre haben ebenfalls fixe |
392 BSDs der 90er Jahre haben ebenfalls fixe Grenzen (_BSD_LINE_MAX | 397 Grenzen (_BSD_LINE_MAX bzw. _POSIX2_LINE_MAX). Bei modernen |
393 bzw. _POSIX2_LINE_MAX). Bei modernen FreeBSDs, NetBSDs, bei | 398 FreeBSDs, NetBSDs, bei allen GNU-Implementierungen und bei |
394 allen GNU-Implementierungen und bei Heirloom kann sowohl | 399 Heirloom kann sowohl die Felderanzahl als auch die maximale |
395 die Felderanzahl als auch die maximale Zeilenlaenge beliebig | 400 Zeilenlaenge beliebig gross werden; der Speicher dafür wird |
396 gross werden; der Speicher dafür wird dynamisch alloziiert. | 401 dynamisch alloziiert. OpenBSD ist ein Hybrid aus fixer |
397 OpenBSD ist ein Hybrid aus fixer Maximalzahl an Feldern, aber | 402 Maximalzahl an Feldern, aber beliebiger Zeilenlaenge. Die |
398 beliebiger Zeilenlaenge. Die begrenzte Felderanzahl scheint | 403 begrenzte Felderanzahl scheint jedoch kein Praxisproblem |
399 jedoch kein praktisches Problem darzustellen, da _POSIX2_LINE_MAX | 404 darzustellen, da _POSIX2_LINE_MAX mit mindestens 2048 durchaus |
400 mit mindestens 2048 durchaus genug Platz bieten sollte. | 405 gross genug sein sollte. |
401 | 406 |
402 | 407 |
403 Beschreibungen | 408 Beschreibungen |
404 | 409 |
405 Interessant ist auch ein Vergleich der Kurzbeschreibungen von | 410 Interessant ist auch ein Vergleich der Kurzbeschreibungen von |
406 cut, wie sie sich in der Titelzeile von Manpages oder manchmal | 411 cut, wie sie sich in der Titelzeile der Manpages oder manchmal |
407 auch am Anfang der Quellcodedatei finden. Die folgende Liste | 412 auch am Anfang der Quellcodedatei finden. Die folgende Liste |
408 ist grob zeitlich geordnet und nach Abstammung gruppiert: | 413 ist grob zeitlich geordnet und nach Abstammung gruppiert: |
409 | 414 |
410 | 415 |
411 System III cut out selected fields of each line of a file | 416 System III cut out selected fields of each line of a file |
434 | 439 |
435 POSIX cut out selected fields of each line of a file | 440 POSIX cut out selected fields of each line of a file |
436 | 441 |
437 | 442 |
438 Die mit ``(src)'' markierten Beschreibungen sind aus dem | 443 Die mit ``(src)'' markierten Beschreibungen sind aus dem |
439 jeweiligen Quellcode entnommen. | 444 jeweiligen Quellcode entnommen. Der POSIX-Eintrag enthaelt |
440 Der POSIX-Eintrag enthaelt die Beschreibung des Standards. | 445 die Beschreibung des Standards. Der ``Unix Reader'' ist ein |
441 Der ``Unix Reader'' ist ein rueckblickendes Textdokument von | 446 rueckblickendes Textdokument von Doug McIlroy, das das |
442 Doug McIlroy, das das Auftreten von Tools in der Geschichte | 447 Auftreten von Tools in der Geschichte des Research Unix zum |
443 des Research Unix zum Thema hat. | 448 Thema hat. |
444 [ http://doc.cat-v.org/unix/unix-reader/contents.pdf | 449 [ http://doc.cat-v.org/unix/unix-reader/contents.pdf |
445 Eigentlich sollte seine | 450 Eigentlich sollte seine Beschreibung der in Version 8 Unix |
446 Beschreibung der in Version 8 Unix entsprechen. Die | 451 entsprechen. Die Abweichung koennte sowohl ein |
447 Abweichung koennte sowohl ein Uebertragungsfehler als auch | 452 Uebertragungsfehler als auch eine nachtraegliche Korrektur |
448 eine nachtraegliche Korrektur sein. | 453 sein. Alle uebrigen Beschreibungen entstammen den Manpages. |
449 Alle uebrigen Beschreibungen entstammen den Manpages. | |
450 | 454 |
451 Oft ist mit der Zeit die POSIX-Beschreibung uebernommen | 455 Oft ist mit der Zeit die POSIX-Beschreibung uebernommen |
452 oder zumindest an sie angeglichen worden, wie beispielsweise | 456 oder an sie angeglichen worden, wie beispielsweise bei FreeBSD. |
453 bei FreeBSD. | |
454 [ https://svnweb.freebsd.org/base?view=revision&revision=167101 | 457 [ https://svnweb.freebsd.org/base?view=revision&revision=167101 |
455 | 458 |
456 Interessant ist, dass die GNU coreutils seit Anbeginn vom | 459 Interessant ist, dass die GNU coreutils seit Anbeginn vom |
457 Entfernen von Teilen der Eingabe sprechen, wohingegen die | 460 Entfernen von Teilen der Eingabe sprechen, wohingegen die |
458 Kommandozeilenangabe klar ein Auswaehlen darstellt. Die | 461 Kommandozeilenangabe klar ein Auswaehlen darstellt. Die |
459 Worte ``cut out'' sind vielleicht auch nur etwas zu | 462 Worte ``cut out'' sind vielleicht auch etwas zu |
460 missverstaendlich. HP-UX hat sie deshalb praezisiert. | 463 missverstaendlich. HP-UX hat sie deshalb praezisiert. |
461 | 464 |
462 Auch beim Begriff, was selektiert wird, ist man sich | 465 Auch beim Begriff, was selektiert wird, ist man sich |
463 uneins. Die einen reden von Feldern (POSIX), andere von | 466 uneins. Die Einen reden von Feldern (POSIX), Andere von |
464 Abschnitten bzw. Teilen (BSD) und wieder andere von Spalten | 467 Abschnitten bzw. Teilen (BSD) und wieder Andere von Spalten |
465 (Research Unix). Ironischerweise leistet sich gerade Version | 468 (Research Unix). Ironischerweise leistet sich gerade Version |
466 8 Unix, das eigentlich um eine sehr treffende Weltsicht | 469 8 Unix, das eigentlich um eine sehr treffende Weltsicht |
467 bemueht ist, mit ``rearrange columns of data'' die | 470 bemueht ist, mit ``rearrange columns of data'' die |
468 unzutreffendste der Beschreibungen. | 471 unzutreffendste der Beschreibungen. |
469 | 472 |