comparison cut.txt @ 19:a62964d0cc54

Verbesserungen durch diction(1) eingearbeitet
author markus schnalke <meillo@marmaro.de>
date Tue, 19 May 2015 08:04:05 +0200
parents b1e7b45fb3c8
children c0e589b92c52
comparison
equal deleted inserted replaced
18:b1e7b45fb3c8 19:a62964d0cc54
17 erweitert wurden. Cut schneidet entweder gewuenschte Zeichen aus 17 erweitert wurden. Cut schneidet entweder gewuenschte Zeichen aus
18 den Zeilen der Eingabe oder gewuenschte, durch Trennzeichen 18 den Zeilen der Eingabe oder gewuenschte, durch Trennzeichen
19 definierte, Felder. 19 definierte, Felder.
20 20
21 Der Zeichenmodus ist optimal geeignet um Festbreitenformate zu 21 Der Zeichenmodus ist optimal geeignet um Festbreitenformate zu
22 zerteilen. So kann man damit beispielsweise bestimmte 22 zerteilen. Man kann damit beispielsweise bestimmte
23 Zugriffsrechte aus der Ausgabe von `ls -l' ausschneiden, in 23 Zugriffsrechte aus der Ausgabe von `ls -l' ausschneiden, in
24 diesem Beispiel die Rechte des Besitzers: 24 diesem Beispiel die Rechte des Besitzers:
25 25
26 $ ls -l foo 26 $ ls -l foo
27 -rw-rw-r-- 1 meillo users 0 May 12 07:32 foo 27 -rw-rw-r-- 1 meillo users 0 May 12 07:32 foo
59 ignorieren), dann macht man das mit: 59 ignorieren), dann macht man das mit:
60 60
61 $ cut -b -500 61 $ cut -b -500
62 62
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 damit
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 Wenn auch der Bytemodus neu eingefuehrt worden war, so sollte 68 Wenn auch der Bytemodus neu eingefuehrt worden war, so sollte
69 er sich doch nur so verhalten wie der alte Zeichenmodus 69 er sich doch nur so verhalten wie der alte Zeichenmodus
70 normalerweise schon implementiert war. Beim Zeichenmodus aber 70 normalerweise schon implementiert war. Beim Zeichenmodus aber
71 wurde eine neue Implementierungsweise gefordert. Das Problem 71 wurde eine neue Implementierungsweise gefordert. Das Problem
72 war also nicht, den neuen Bytemodus zu implementieren, sondern 72 war folglich 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 Bytemodus bietet cut noch den 75 Neben dem Zeichen- und Bytemodus bietet cut noch den
76 Feldmodus, 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. Es gilt sowohl 78 Default der Tab) kann mit `-d' geaendert werden. Es gilt in
79 fuer die Eingabe als auch fuer die Ausgabe. 79 gleicher Weise fuer die Eingabe und die Ausgabe.
80 80
81 Der typische Anwendungsfall fuer cut im Feldmodus ist die 81 Der typische Anwendungsfall fuer cut im Feldmodus ist die
82 Auswahl von Information aus der passwd-Datei. So z.B. der 82 Auswahl von Information aus der passwd-Datei. Hier z.B. der
83 Benutzername und seine ID: 83 Benutzername und seine ID:
84 84
85 $ cut -d: -f1,3 /etc/passwd 85 $ cut -d: -f1,3 /etc/passwd
86 root:0 86 root:0
87 bin:1 87 bin:1
95 Dieser Feldmodus ist fuer einfache tabellarische Dateien, 95 Dieser Feldmodus ist fuer einfache tabellarische Dateien,
96 wie eben die passwd, gut geeignet. Er kommt aber schnell an 96 wie eben die passwd, gut geeignet. Er kommt aber schnell an
97 seine Grenzen. Gerade der haeufige Fall, dass an Whitespace 97 seine Grenzen. Gerade der haeufige Fall, dass an Whitespace
98 in Felder geteilt werden soll, wird damit nicht abgedeckt. 98 in Felder geteilt werden soll, wird damit nicht abgedeckt.
99 Der Delimiter kann bei cut nur genau ein Zeichen sein. Es kann 99 Der Delimiter kann bei cut nur genau ein Zeichen sein. Es kann
100 also nicht sowohl an Leerzeichen als auch an Tabs aufgetrennt 100 demnach nicht sowohl an Leerzeichen als auch an Tabs aufgetrennt
101 werden. Auch unterteilt cut an jedem Trennzeichen. Zwei aneinander 101 werden. Zudem unterteilt cut an jedem Trennzeichen. Zwei aneinander
102 stehende Trennzeichen fuehren zu einem leeren Feld. Dieses 102 stehende Trennzeichen fuehren zu einem leeren Feld. Dieses
103 Verhalten widerspricht den Erwartungen, die man an die 103 Verhalten widerspricht den Erwartungen, die man an die
104 Verarbeitung einer Datei mit Whitespace-getrennten Feldern 104 Verarbeitung einer Datei mit Whitespace-getrennten Feldern
105 hat. Manche Implementierungen von cut, z.B. die von FreeBSD, 105 hat. Manche Implementierungen von cut, z.B. die von FreeBSD,
106 haben deshalb Erweiterungen, die das gewuenschte Verhalten 106 haben deshalb Erweiterungen, die das gewuenschte Verhalten
109 Faellen. 109 Faellen.
110 110
111 Awk bietet noch eine weitere Funktion, die cut missen 111 Awk bietet noch eine weitere Funktion, die cut missen
112 laesst: Das Tauschen der Feld-Reihenfolge in der Ausgabe. Bei 112 laesst: Das Tauschen der Feld-Reihenfolge in der Ausgabe. Bei
113 cut ist die Reihenfolge der Feldauswahlangabe irrelevant; ein 113 cut ist die Reihenfolge der Feldauswahlangabe irrelevant; ein
114 Feld kann selbst mehrfach angegeben werden. So gibt der Aufruf 114 Feld kann selbst mehrfach angegeben werden. Dementsprechend gibt
115 der Aufruf
115 von `cut -c 5-8,1,4-6' die Zeichen Nummer 1, 4, 5, 6, 7 und 8 116 von `cut -c 5-8,1,4-6' die Zeichen Nummer 1, 4, 5, 6, 7 und 8
116 in genau dieser Reihenfolge aus. Die Auswahl entspricht damit 117 in genau dieser Reihenfolge aus. Die Auswahl entspricht damit
117 der Mengenlehre in der Mathematik: Jedes angegebene Feld wird 118 der Mengenlehre in der Mathematik: Jedes angegebene Feld wird
118 Teil der Ergebnismenge. Die Felder der Ergebnismenge sind 119 Teil der Ergebnismenge. Die Felder der Ergebnismenge sind
119 dabei immer gleich geordnet wie in der Eingabe. Um die Worte 120 hierbei immer gleich geordnet wie in der Eingabe. Um die Worte
120 der Manpage von Version 8 Unix wiederzugeben: ``In data base 121 der Manpage von Version 8 Unix wiederzugeben: ``In data base
121 parlance, it projects a relation.'' 122 parlance, it projects a relation.''
122 [ http://man.cat-v.org/unix_8th/1/cut 123 [ http://man.cat-v.org/unix_8th/1/cut
123 Cut fuehrt also die Datenbankoperation Projektion auf 124 Cut fuehrt demnach die Datenbankoperation Projektion auf
124 Textdateien aus. Die Wikipedia erklaert das folgendermassen: 125 Textdateien aus. Die Wikipedia erklaert das folgendermassen:
125 126
126 Die Projektion entspricht der Projektionsabbildung aus der 127 Die Projektion entspricht der Projektionsabbildung aus der
127 Mengenlehre und kann auch Attributbeschränkung genannt 128 Mengenlehre und kann auch Attributbeschränkung genannt
128 werden. Sie extrahiert einzelne Attribute aus der 129 werden. Sie extrahiert einzelne Attribute aus der
140 III durchforstet, findet man die Quellcodedatei cut.c mit dem 141 III durchforstet, findet man die Quellcodedatei cut.c mit dem
141 Zeitstempel 1980-04-11. 142 Zeitstempel 1980-04-11.
142 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/cmd 143 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/cmd
143 Das ist die aelteste Manifestation des Programms, die ich 144 Das ist die aelteste Manifestation des Programms, die ich
144 aufstoebern konnte. Allerdings spricht die SCCS-ID im 145 aufstoebern konnte. Allerdings spricht die SCCS-ID im
145 Quellcode von Version 1.5. Es muss also noch eine 146 Quellcode von Version 1.5. Es muss demzufolge noch eine
146 Vorgeschichte geben. Zu dieser habe ich leider keinen Zugang 147 Vorgeschichte geben. Zu dieser habe ich leider keinen Zugang
147 gefunden. 148 gefunden.
148 XXX mail an TUHS 149 XXX mail an TUHS
149 150
150 Nun ein Blick auf die BSD-Linie: Dort ist mein fruehester 151 Nun ein Blick auf die BSD-Linie: Dort ist mein fruehester
163 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut 164 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut
164 Seine Manpage 165 Seine Manpage
165 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut/cut.1 166 [ 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. 167 erwaehnt bereits die erwartete Konformitaet mit POSIX.2.
167 Nun muss man wissen, dass POSIX.2 erst im September 168 Nun muss man wissen, dass POSIX.2 erst im September
168 1992 veroeffentlicht wurde, also gut zwei Jahren nachdem die 169 1992 veroeffentlicht wurde, erst gut zwei Jahren nachdem die
169 Manpage und das Programm geschrieben worden waren. Das Programm 170 Manpage und das Programm geschrieben worden waren. Das Programm
170 wurde folglich anhand von Arbeitsversionen des Standards 171 wurde folglich anhand von Arbeitsversionen des Standards
171 implementiert. Ein Blick in den Code bekraeftigt diese Vermutung. 172 implementiert. Ein Blick in den Code bekraeftigt diese Vermutung.
172 In der Funktion zum parsen der Feldauswahlliste findet sich 173 In der Funktion zum parsen der Feldauswahlliste findet sich
173 dieser Kommentar: 174 dieser Kommentar:
180 ein: 181 ein:
181 182
182 The elements in list can be repeated, can overlap, and can 183 The elements in list can be repeated, can overlap, and can
183 be specified in any order. 184 be specified in any order.
184 185
185 Auch listet Draft 11.2 alle drei Modi, waehrend in diesem 186 Zudem listet Draft 11.2 alle drei Modi, waehrend in diesem
186 BSD cut nur die zwei alten implementiert sind. Es koennte also 187 BSD cut nur die zwei alten implementiert sind. Es koennte also
187 sein, dass in Draft 9 der Bytemodus noch nicht vorhanden war. 188 sein, dass in Draft 9 der Bytemodus noch nicht vorhanden war.
188 Da ich keinen Zugang zu Draft 9 oder 10 finden konnte, war es mir 189 Da ich keinen Zugang zu Draft 9 oder 10 finden konnte, war es mir
189 leider nicht moeglich, diese Vermutung zu pruefen. XXX 190 leider nicht moeglich, diese Vermutung zu pruefen. XXX
190 191
207 208
208 Trotz der vielen Jahreszahlen aus den 80er Jahren gehoert cut, 209 Trotz der vielen Jahreszahlen aus den 80er Jahren gehoert cut,
209 aus Sicht des urspruenglichen Unix, zu den juengeren Tools. 210 aus Sicht des urspruenglichen Unix, zu den juengeren Tools.
210 Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist, 211 Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist,
211 so war Unix doch schon ueber zehn Jahre alt, als cut das 212 so war Unix doch schon ueber zehn Jahre alt, als cut das
212 erste Mal auftauchte. Insbesondere gehoerte cut auch noch nicht 213 erste Mal auftauchte. Insbesondere gehoerte cut noch nicht
213 zu Version 7 Unix, das die Ausgangsbasis aller modernen 214 zu Version 7 Unix, das die Ausgangsbasis aller modernen
214 Unix-Systeme darstellt. Die weit komplexeren Programme sed 215 Unix-Systeme darstellt. Die weit komplexeren Programme sed
215 und awk waren dort schon vertreten. Man muss sich also 216 und awk waren dort schon vertreten. Man muss sich also
216 fragen, warum cut ueberhaupt noch entwickelt wurde, wo es 217 fragen, warum cut ueberhaupt noch entwickelt wurde, wo es
217 schon zwei Programme gab, die die Funktion von cut abdecken 218 schon zwei Programme gab, die die Funktion von cut abdecken
362 moderne GNU-Variante mit fast 600 SLOCs. 363 moderne GNU-Variante mit fast 600 SLOCs.
363 364
364 Die Abweichung zwischen logischen Codezeilen (SLOC, ermittelt mit 365 Die Abweichung zwischen logischen Codezeilen (SLOC, ermittelt mit
365 SLOCcount) und der Anzahl von Zeilenumbruechen in der Datei (`wc 366 SLOCcount) und der Anzahl von Zeilenumbruechen in der Datei (`wc
366 -l') erstreckt sich ueber eine Spanne von Faktor 1.06 bei den 367 -l') erstreckt sich ueber eine Spanne von Faktor 1.06 bei den
367 aeltesten Vertretern bis zu Faktor 1.5 bei GNU. Der groesste 368 aeltesten Vertretern bis zu Faktor 1.5 bei GNU. Den groessten
368 Einflussfaktor darauf haben Leerzeilen, reine Kommentarzeilen und 369 Einfluss darauf haben Leerzeilen, reine Kommentarzeilen und
369 die Groesse des Lizenzblocks am Dateianfang. 370 die Groesse des Lizenzblocks am Dateianfang.
370 371
371 Betrachtet man die Abweichungen zwischen den logischen Codezeilen 372 Betrachtet man die Abweichungen zwischen den logischen Codezeilen
372 und der Dateigroesse (`wc -c'), so pendelt das Teilnehmerfeld 373 und der Dateigroesse (`wc -c'), so pendelt das Teilnehmerfeld
373 zwischen 25 und 30 Bytes je Anweisung. Die Heirloom-Implementierung 374 zwischen 25 und 30 Bytes je Anweisung. Die Heirloom-Implementierung
383 Die interne Struktur der Programmcodes (in C) ist meist aehnlich. 384 Die interne Struktur der Programmcodes (in C) ist meist aehnlich.
384 Neben der obligatorischen main-Funktion, die die Kommandozeilenargumente 385 Neben der obligatorischen main-Funktion, die die Kommandozeilenargumente
385 verarbeitet, gibt es im Normalfall eine Funktion, die die 386 verarbeitet, gibt es im Normalfall eine Funktion, die die
386 Feldauswahl in eine interne Datenstruktur ueberfuehrt. Desweiteren 387 Feldauswahl in eine interne Datenstruktur ueberfuehrt. Desweiteren
387 haben fast alle Implementierungen separate Funktionen fuer die 388 haben fast alle Implementierungen separate Funktionen fuer die
388 zwei bzw. drei Modi. Bei den POSIX-konformen Implementierungen 389 zwei oder drei Modi. Bei den POSIX-konformen Implementierungen
389 wird die `-b -n'-Kombination als weiterer Modus behandelt, und 390 wird die `-b -n'-Kombination als weiterer Modus behandelt, und
390 damit in einer eigenen Funktion umgesetzt. Nur bei der fruehen 391 damit in einer eigenen Funktion umgesetzt. Nur bei der fruehen
391 System III-Implementierung (und seiner 4.3BSD-UWisc-Variante) 392 System III-Implementierung (und seiner 4.3BSD-UWisc-Variante)
392 wird ausser den Fehlerausgaben alles in der main-Funktion 393 wird ausser den Fehlerausgaben alles in der main-Funktion
393 erledigt. 394 erledigt.
407 gross genug sein sollte. 408 gross genug sein sollte.
408 409
409 410
410 Beschreibungen 411 Beschreibungen
411 412
412 Interessant ist auch ein Vergleich der Kurzbeschreibungen von 413 Interessant ist zudem ein Vergleich der Kurzbeschreibungen von
413 cut, wie sie sich in der Titelzeile der Manpages oder manchmal 414 cut, wie sie sich in der Titelzeile der Manpages oder manchmal
414 auch am Anfang der Quellcodedatei finden. Die folgende Liste 415 am Anfang der Quellcodedatei finden. Die folgende Liste
415 ist grob zeitlich geordnet und nach Abstammung gruppiert: 416 ist grob zeitlich geordnet und nach Abstammung gruppiert:
416 417
417 418
418 System III cut out selected fields of each line of a file 419 System III cut out selected fields of each line of a file
419 System III (src) cut and paste columns of a table (projection of a relation) 420 System III (src) cut and paste columns of a table (projection of a relation)
448 rueckblickendes Textdokument von Doug McIlroy, das das 449 rueckblickendes Textdokument von Doug McIlroy, das das
449 Auftreten der Tools in der Geschichte des Research Unix zum 450 Auftreten der Tools in der Geschichte des Research Unix zum
450 Thema hat. 451 Thema hat.
451 [ http://doc.cat-v.org/unix/unix-reader/contents.pdf 452 [ http://doc.cat-v.org/unix/unix-reader/contents.pdf
452 Eigentlich sollte seine Beschreibung der in Version 8 Unix 453 Eigentlich sollte seine Beschreibung der in Version 8 Unix
453 entsprechen. Die Abweichung koennte sowohl ein 454 entsprechen. Die Abweichung koennte ein Uebertragungsfehler
454 Uebertragungsfehler als auch eine nachtraegliche Korrektur 455 oder eine nachtraegliche Korrektur sein. Alle uebrigen
455 sein. Alle uebrigen Beschreibungen entstammen den Manpages. 456 Beschreibungen entstammen den Manpages.
456 457
457 Oft ist mit der Zeit die POSIX-Beschreibung uebernommen 458 Oft ist mit der Zeit die POSIX-Beschreibung uebernommen
458 oder an sie angeglichen worden, wie beispielsweise bei FreeBSD. 459 oder an sie angeglichen worden, wie beispielsweise bei FreeBSD.
459 [ https://svnweb.freebsd.org/base?view=revision&revision=167101 460 [ https://svnweb.freebsd.org/base?view=revision&revision=167101
460 461
461 Interessant ist, dass die GNU coreutils seit Anbeginn vom 462 Interessant ist, dass die GNU coreutils seit Anbeginn vom
462 Entfernen von Teilen der Eingabe sprechen, wohingegen die 463 Entfernen von Teilen der Eingabe sprechen, wohingegen die
463 Kommandozeilenangabe klar ein Auswaehlen darstellt. Die 464 Kommandozeilenangabe klar ein Auswaehlen darstellt. Die
464 Worte ``cut out'' sind vielleicht auch etwas zu 465 Worte ``cut out'' sind vielleicht auch zu missverstaendlich.
465 missverstaendlich. HP-UX hat sie deshalb praezisiert. 466 HP-UX hat sie deshalb praezisiert.
466 467
467 Auch beim Begriff, was selektiert wird, ist man sich 468 Beim Begriff, was selektiert wird, ist man sich ebenfalls
468 uneins. Die Einen reden von Feldern (POSIX), Andere von 469 uneins. Die Einen reden von Feldern (POSIX), Andere von
469 Abschnitten bzw. Teilen (BSD) und wieder Andere von Spalten 470 Abschnitten bzw. Teilen (BSD) und wieder Andere von Spalten
470 (Research Unix). Ironischerweise leistet sich gerade Version 471 (Research Unix). Ironischerweise leistet sich gerade Version
471 8 Unix, das eigentlich um eine sehr treffende Weltsicht 472 8 Unix, das eigentlich um eine sehr treffende Weltsicht
472 bemueht ist, mit ``rearrange columns of data'' die 473 bemueht ist, mit ``rearrange columns of data'' die