comparison cut.txt @ 10:7e1214b556b9

Zwischenstand
author markus schnalke <meillo@marmaro.de>
date Mon, 11 May 2015 07:09:00 +0200
parents e67bd0d48bd6
children 04a8a33fc48a
comparison
equal deleted inserted replaced
9:e67bd0d48bd6 10:7e1214b556b9
34 $ ls -l | cut -c 3,6,9 34 $ ls -l | cut -c 3,6,9
35 ww- 35 ww-
36 36
37 Mit cut lassen sich aber auch Strings kuerzen. 37 Mit cut lassen sich aber auch Strings kuerzen.
38 38
39 $ echo "$long" | cut -c -20 39 $ long=12345678901234567890
40 40 $ echo "$long" | cut -c -10
41 Dieser Befehl gibt die ersten maximal 20 Zeichen von 41 1234567890
42
43 Dieser Befehl gibt die ersten maximal 10 Zeichen von
42 `$long' aus. (Alternativ kann man hierfuer auch `printf 44 `$long' aus. (Alternativ kann man hierfuer auch `printf
43 "%.20s\n" "$long"' verwenden.) 45 "%.10s\n" "$long"' verwenden.)
44 46
45 Geht es aber nicht um die Darstellung von Zeichen, sondern um 47 Geht es aber nicht um die Darstellung von Zeichen, sondern um
46 ihre Speicherung, dann ist `-c' nicht unbedingt geeignet. 48 ihre Speicherung, dann ist `-c' nicht unbedingt geeignet.
47 Frueher, als US-ASCII als Zeichensatz und -kodierung 49 Frueher, als US-ASCII als Zeichensatz und -kodierung
48 noch omnipraesent war, wurde jedes Zeichen mit genau einem 50 noch omnipraesent war, wurde jedes Zeichen mit genau einem
60 Den Rest kann man sich mit `cut -b 501-' einfangen. Diese 62 Den Rest kann man sich mit `cut -b 501-' einfangen. Diese
61 Funktion ist insbesondere fuer POSIX wichtig, da man so 63 Funktion ist insbesondere fuer POSIX wichtig, da man so
62 Textdateien mit begrenzter Zeilenlaenge erzeugen kann. 64 Textdateien mit begrenzter Zeilenlaenge erzeugen kann.
63 [ http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html#tag_20_28_17 65 [ http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html#tag_20_28_17
64 66
65 Neben dem Zeichen- bzw. Byte-Modus bietet cut noch den 67 Auch wenn der Bytemodus neu eingefuehrt wurde, so sollte er
68 sich doch nur so verhalten wie der alte Zeichenmodus normalerweise
69 implementiert war. Beim Zeichenmodus aber wurde durch POSIX.2
70 eine andere Implementierungsweise gefordert. Das Problem war
71 also nicht, den neuen Bytemodus zu implementieren, sondern
72 den Zeichenmodus neu zu implementieren.
73
74 Neben dem Zeichen- und Byte-Modus bietet cut noch den
66 Feld-Modus, den man mit `-f' einleitet. Mit ihm 75 Feld-Modus, den man mit `-f' einleitet. Mit ihm
67 koennen Felder ausgewaehlt werden. Das Trennzeichen (per 76 koennen Felder ausgewaehlt werden. Das Trennzeichen (per
68 Default der Tab) kann mit `-d' geaendert werden. 77 Default der Tab) kann mit `-d' geaendert werden.
69 78
70 Der typische Anwendungsfall fuer cut im Feld-Modus ist die 79 Der typische Anwendungsfall fuer cut im Feld-Modus ist die
71 Auswahl von Information aus der passwd-Datei. So z.B. der 80 Auswahl von Information aus der passwd-Datei. So z.B. der
72 Benutername, seine ID und das Homeverzeichnis: 81 Benutzername, seine ID und das Homeverzeichnis:
73 82
74 $ cut -d: -f1,3,6 /etc/passwd 83 $ cut -d: -f1,3,6 /etc/passwd
75 root:0:/root 84 root:0:/root
76 bin:1:/bin 85 bin:1:/bin
77 daemon:2:/sbin 86 daemon:2:/sbin
108 dabei immer gleich geordnet wie in der Eingabe. Um die Worte 117 dabei immer gleich geordnet wie in der Eingabe. Um die Worte
109 der Manpage XXX von Version 8 Unix wiederzugeben: ``In data base 118 der Manpage XXX von Version 8 Unix wiederzugeben: ``In data base
110 parlance, it projects a relation.'' 119 parlance, it projects a relation.''
111 [ XXX 120 [ XXX
112 Cut fuehrt also die Datenbankoperation Projektion auf 121 Cut fuehrt also die Datenbankoperation Projektion auf
113 Textdateien aus. Die Wikipedia erklaert das in 122 Textdateien aus. Die Wikipedia erklaert das folgendermassen:
114 verstaendlicherer Sprache:
115 123
116 Die Projektion entspricht der Projektionsabbildung aus der 124 Die Projektion entspricht der Projektionsabbildung aus der
117 Mengenlehre und kann auch Attributbeschränkung genannt 125 Mengenlehre und kann auch Attributbeschränkung genannt
118 werden. Sie extrahiert einzelne Attribute aus der 126 werden. Sie extrahiert einzelne Attribute aus der
119 ursprünglichen Attributmenge und ist somit als eine Art 127 ursprünglichen Attributmenge und ist somit als eine Art
135 Quellcode von Version 1.5. Es muss also noch eine 143 Quellcode von Version 1.5. Es muss also noch eine
136 Vorgeschichte geben. Zu dieser habe ich leider keinen Zugang 144 Vorgeschichte geben. Zu dieser habe ich leider keinen Zugang
137 gefunden. 145 gefunden.
138 XXX mail an TUHS 146 XXX mail an TUHS
139 147
140 Aber werfen wir doch einen Blick auf die BSD-Linie: Dort ist mein 148 Nun ein Blick auf die BSD-Linie: Dort ist mein
141 fruehester Fund ein cut.c mit dem Dateimodifikationsdatum 149 fruehester Fund ein cut.c mit dem Dateimodifikationsdatum
142 1986-11-07 150 1986-11-07
143 [ 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
144 als Teil der Spezialversion 4.3BSD-UWisc, 152 als Teil der Spezialversion 4.3BSD-UWisc,
145 [ http://gunkies.org/wiki/4.3_BSD_NFS_Wisconsin_Unix 153 [ http://gunkies.org/wiki/4.3_BSD_NFS_Wisconsin_Unix
155 Seine Manpage 163 Seine Manpage
156 [ 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
157 erwaehnt bereits die erwartete Konformitaet mit POSIX.2. 165 erwaehnt bereits die erwartete Konformitaet mit POSIX.2.
158 XXX 2 oder 3 modi? 166 XXX 2 oder 3 modi?
159 Nun sollte man wissen, dass POSIX.2 erst im September 167 Nun sollte man wissen, dass POSIX.2 erst im September
160 1992 veroeffentlicht wurde, also gut zwei Jahren *nachdem* die 168 1992 veroeffentlicht wurde, also gut zwei Jahren nachdem die
161 Manpage und das Programm geschrieben wurden. Das Programm 169 Manpage und das Programm geschrieben wurden. Das Programm
162 wurde also anhand von Arbeitsversionen des Standards 170 wurde folglich anhand von Arbeitsversionen des Standards
163 implementiert. Zweieinhalb Jahre Arbeit war immerhin schon in 171 implementiert. Zweieinhalb Jahre Arbeit war immerhin schon in
164 den Standardisierungsprozess geflossen; bis zur 172 den Standardisierungsprozess geflossen; bis zur
165 Fertigstellung sollte es aber noch weitere zwei Jahre dauern. 173 Fertigstellung sollte es aber noch weitere zwei Jahre dauern.
166 174
167 Das cut der GNU Coreutils enthaelt einen Copyrightvermerk von 175 Das cut der GNU Coreutils enthaelt einen Copyrightvermerk von
168 David M. Ihnat aus dem Jahr 1984. 176 David M. Ihnat aus dem Jahr 1984.
169 177
170 Trotz all dieser Jahreszahlen aus den 80er Jahren gehoert cut 178 Trotz all dieser Jahreszahlen aus den 80er Jahren gehoert cut,
171 aus Sicht des urspruenglichen Unix zu den juengeren Tools. 179 aus Sicht des urspruenglichen Unix, zu den juengeren Tools.
172 Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist, 180 Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist,
173 so war Unix doch schon ueber zehn Jahre alt, als cut das 181 so war Unix doch schon ueber zehn Jahre alt, als cut das
174 erste Mal auftauchte. Insbesondere gehoerte cut auch noch nicht 182 erste Mal auftauchte. Insbesondere gehoerte cut auch noch nicht
175 zu Version 7 Unix, das die Ausgangsbasis aller modernen 183 zu Version 7 Unix, das die Ausgangsbasis aller modernen
176 Unix-Systeme darstellt. Die weit komplexeren Programme sed 184 Unix-Systeme darstellt. Die weit komplexeren Programme sed
196 Multibyte-Unterstuetzung 204 Multibyte-Unterstuetzung
197 205
198 Nun sind der Bytemodus und die damit verbundene 206 Nun sind der Bytemodus und die damit verbundene
199 Multibyte-Verarbeitung des POSIX-Zeichenmodus bereits seit 207 Multibyte-Verarbeitung des POSIX-Zeichenmodus bereits seit
200 1992 standardisiert, wie steht es aber mit deren Umsetzung? 208 1992 standardisiert, wie steht es aber mit deren Umsetzung?
201 Welche Versionen implementieren denn den POSIX korrekt? 209 Welche Versionen implementieren POSIX korrekt?
202 Die Situation ist dreiteilig: Es gibt traditionelle 210 Die Situation ist dreiteilig: Es gibt traditionelle
203 Implementierungen, die nur -c und -f kennen. Dann gibt es 211 Implementierungen, die nur -c und -f kennen. Dann gibt es
204 Implementierungen die zwar -b kennen, es aber nur als Alias 212 Implementierungen die -b zwar kennen, es aber lediglich als Alias
205 fuer -c handhaben. Diese Implementierungen funktionieren mit 213 fuer -c handhaben. Diese Implementierungen funktionieren mit
206 Single-Byte-Encodings (z.B. US-ASCII, Latin1) korrekt, bei 214 Single-Byte-Encodings (z.B. US-ASCII, Latin1) korrekt, bei
207 Multi-Byte-Encodings (z.B. UTF-8) verhaelt sich ihr -c aber 215 Multi-Byte-Encodings (z.B. UTF-8) verhaelt sich ihr -c aber
208 wie -b (und -n wird ignoriert). Schliesslich gibt es noch 216 wie -b (und -n wird ignoriert). Schliesslich gibt es noch
209 Implementierungen, die -b und -c tatsaechlich POSIX-konform 217 Implementierungen, die -b und -c tatsaechlich POSIX-konform
210 implementieren. 218 implementieren.
211 219
212 Traditionelle Zwei-Modi-Implementierungen sind z.B. die von 220 Traditionelle Zwei-Modi-Implementierungen sind z.B. die von
213 System III, System V und die aller BSDs bis in die 90er. 221 System III, System V und die aller BSDs bis in die 90er.
214 222
215 Pseude-Multibyte-Implementierungen bieten GNU und die 223 Pseudo-Multibyte-Implementierungen bieten GNU und die
216 modernen NetBSDs und OpenBSDs. Wie sehr dort ein Schein von 224 modernen NetBSDs und OpenBSDs. Wie sehr dort ein Schein von
217 POSIX-Konformitaet gewahrt wird, ist unterschiedlich. Nicht 225 POSIX-Konformitaet gewahrt wird, ist unterschiedlich. Nicht
218 immer findet man klare Aussagen wie diese: 226 immer findet man klare Aussagen wie diese:
219 227
220 /* Since we don't support multi-byte characters, the -c and -b 228 /* Since we don't support multi-byte characters, the -c and -b
247 255
248 In diesem Fall sind es zwei Bytes: oktal 303 und 244 . (Den 256 In diesem Fall sind es zwei Bytes: oktal 303 und 244 . (Den
249 Zeilenumbruch fuegt echo(1) hinzu.) 257 Zeilenumbruch fuegt echo(1) hinzu.)
250 258
251 Mit dem Programm iconv(1) kann man Text explizit in bestimmte 259 Mit dem Programm iconv(1) kann man Text explizit in bestimmte
252 Kodierungen konvertieren. Hier Beispiele, wie das Ergebnis 260 Kodierungen konvertieren. Hier Beispiele, wie die Ausgabe
253 bei Latin1 und wie es bei UTF-8 aussieht. 261 bei Latin1 und wie sie bei UTF-8 aussieht.
254 262
255 $ echo ä | iconv -t latin1 | od -c 263 $ echo ä | iconv -t latin1 | od -c
256 0000000 344 \n 264 0000000 344 \n
257 0000002 265 0000002
258 266
264 wird recht sicher einer dieser beiden Ausgaben entsprechen. 272 wird recht sicher einer dieser beiden Ausgaben entsprechen.
265 273
266 Nun zum Test der cut-Implementierung. Hat man ein UTF-8-System, 274 Nun zum Test der cut-Implementierung. Hat man ein UTF-8-System,
267 dann sollte sich eine POSIX-konforme Implementierung so verhalten: 275 dann sollte sich eine POSIX-konforme Implementierung so verhalten:
268 276
269 $ echo aä | ./cut -c -2 | od -c 277 $ echo ä | ./cut -c 1 | od -c
270 0000000 a 303 244 \n 278 0000000 303 244 \n
271 0000004
272
273 $ echo aä | ./cut -b -2 | od -c
274 0000000 a 303 \n
275 0000003 279 0000003
276 280
277 $ echo aä | ./cut -b -2 -n | od -c 281 $ echo ä | ./cut -b 1 | od -c
278 0000000 a \n 282 0000000 303 \n
279 0000002 283 0000002
280 284
281 Bei einer Implementierung, die -b und -c gleich behandelt, 285 $ echo ä | ./cut -b 1 -n | od -c
282 ist die Ausgabe in allen drei Faellen wie die mittlere: Es 286 0000000 \n
283 werden die ersten beiden Bytes ausgegeben. 287 0000001
288
289 Bei einer Pseudo-POSIX-Implementierung ist die Ausgabe in
290 allen drei Faellen wie die mittlere: Es wird das erste Byte
291 ausgegeben.
284 292
285 293
286 Implementierungen 294 Implementierungen
287 295
288 Nun ein Blick auf den Code. Betrachtet wird eine Auswahl an 296 Nun ein Blick auf den Code. Betrachtet wird eine Auswahl an
328 336
329 Betrachtet man die Abweichungen zwischen den logischen Codezeilen 337 Betrachtet man die Abweichungen zwischen den logischen Codezeilen
330 und der Dateigroesse (`wc -c'), so pendelt das Teilnehmerfeld 338 und der Dateigroesse (`wc -c'), so pendelt das Teilnehmerfeld
331 zwischen 25 und 30 Bytes je Anweisung. Die Heirloom-Implementierung 339 zwischen 25 und 30 Bytes je Anweisung. Die Heirloom-Implementierung
332 weicht mit nur 21 nach unten ab, die GNU-Implementierungen mit 340 weicht mit nur 21 nach unten ab, die GNU-Implementierungen mit
333 fast 40 nach oben. Dies liegt bei GNU hauptsaechlich am 341 fast 40 nach oben. Dies liegt bei GNU hauptsaechlich an deren
334 Programmierstil, mit spezieller Einrueckung und langen Bezeichnern. 342 Programmierstil, mit spezieller Einrueckung und langen Bezeichnern.
335 Ob man die Heirloom-Implementierung als besonders kryptisch 343 Ob man die Heirloom-Implementierung als besonders kryptisch
336 oder als besonders elegant bezeichnen will, das soll der 344 oder als besonders elegant bezeichnen will, das soll der
337 eigenen Einschaetzung des Lesers ueberlassen bleiben. 345 eigenen Einschaetzung des Lesers ueberlassen bleiben.
338 346
382 4.3BSD-UWisc (src) cut and paste columns of a table (projection of a relation) 390 4.3BSD-UWisc (src) cut and paste columns of a table (projection of a relation)
383 4.3BSD-Reno select portions of each line of a file 391 4.3BSD-Reno select portions of each line of a file
384 NetBSD select portions of each line of a file 392 NetBSD select portions of each line of a file
385 OpenBSD 4.6 select portions of each line of a file 393 OpenBSD 4.6 select portions of each line of a file
386 FreeBSD 1.0 select portions of each line of a file 394 FreeBSD 1.0 select portions of each line of a file
387 FreeBSD 7.0 cut out selected portions of each line of a file 395 FreeBSD 10.0 cut out selected portions of each line of a file
388 SunOS 4.1.3 remove selected fields from each line of a file 396 SunOS 4.1.3 remove selected fields from each line of a file
389 SunOS 5.5.1 cut out selected fields of each line of a file 397 SunOS 5.5.1 cut out selected fields of each line of a file
390 XXX FreeBSD 10
391 398
392 Heirloom Tools cut out selected fields of each line of a file 399 Heirloom Tools cut out selected fields of each line of a file
393 Heirloom Tools (src) cut out fields of lines of files 400 Heirloom Tools (src) cut out fields of lines of files
394 401
395 GNU coreutils remove sections from each line of files 402 GNU coreutils remove sections from each line of files
421 XXX fixme! 428 XXX fixme!
422 429
423 Interessant ist, dass die GNU coreutils seit Anbeginn vom 430 Interessant ist, dass die GNU coreutils seit Anbeginn vom
424 Entfernen von Teilen der Eingabe sprechen, wohingegen die 431 Entfernen von Teilen der Eingabe sprechen, wohingegen die
425 Kommandozeilenangabe klar ein Auswaehlen darstellt. Die 432 Kommandozeilenangabe klar ein Auswaehlen darstellt. Die
426 Worte ``cut out'' sind vielleicht auch etwas 433 Worte ``cut out'' sind vielleicht auch nur etwas zu
427 missverstaendlich. HP-UX hat sie deshalb praezisiert. 434 missverstaendlich. HP-UX hat sie deshalb praezisiert.
428 435
429 Auch beim Begriff, was denn nun selektiert wird, ist man sich 436 Auch beim Begriff, was selektiert wird, ist man sich
430 uneins. Die einen reden von Feldern (POSIX), andere von 437 uneins. Die einen reden von Feldern (POSIX), andere von
431 Abschnitten bzw. Teilen (BSD) und wieder andere von Spalten 438 Abschnitten bzw. Teilen (BSD) und wieder andere von Spalten
432 (Research Unix). Ironischerweise leistet sich gerade Version 439 (Research Unix). Ironischerweise leistet sich gerade Version
433 8 Unix, das eigentlich um eine sehr treffende Weltsicht 440 8 Unix, das eigentlich um eine sehr treffende Weltsicht
434 bemueht ist, mit ``rearrange columns of data'' die 441 bemueht ist, mit ``rearrange columns of data'' die
441 von Unix und seinen Werkzeugen. Fuer die Erarbeitung dieses 448 von Unix und seinen Werkzeugen. Fuer die Erarbeitung dieses
442 Textes wurde er regelrecht zum Historiker. 449 Textes wurde er regelrecht zum Historiker.
443 450
444 451
445 Lizenz 452 Lizenz
453
446 CC0 (und kann damit auch unter CC BY-SA 4.0 Unported 454 CC0 (und kann damit auch unter CC BY-SA 4.0 Unported
447 veroeffentlicht werden) 455 veroeffentlicht werden)