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