Mercurial > docs > cut
annotate cut.txt @ 21:bac481be86d7
Umlaute konvertiert
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Thu, 28 May 2015 06:41:08 +0200 |
parents | c0e589b92c52 |
children | 4193939c6a24 |
rev | line source |
---|---|
6 | 1 cut - cut out selected fields of each line of a file |
2 ---------------------------------------------------- | |
3 markus schnalke <meillo@marmaro.de> | |
4 2015-05 | |
0 | 5 |
6 | |
1 | 7 Cut ist ein klassisches Programm im Unix-Werkzeugkasten. |
8 | 8 In keinem ordentlichen Tutorial zur Shellprogrammierung fehlt |
21 | 9 es, denn es ist ein schönes, praktisches und anschauliches |
9 | 10 Helferlein. Hier soll ein wenig hinter seine Fassade geschaut |
11 werden. | |
0 | 12 |
13 | |
4 | 14 Funktionsweise |
15 | |
21 | 16 Ursprünglich hatte cut zwei Modi, die später um einen dritten |
17 erweitert wurden. Cut schneidet entweder gewünschte Zeichen aus | |
18 den Zeilen der Eingabe oder gewünschte, durch Trennzeichen | |
8 | 19 definierte, Felder. |
0 | 20 |
9 | 21 Der Zeichenmodus ist optimal geeignet um Festbreitenformate zu |
19
a62964d0cc54
Verbesserungen durch diction(1) eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
18
diff
changeset
|
22 zerteilen. Man kann damit beispielsweise bestimmte |
9 | 23 Zugriffsrechte aus der Ausgabe von `ls -l' ausschneiden, in |
24 diesem Beispiel die Rechte des Besitzers: | |
0 | 25 |
15
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
26 $ ls -l foo |
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
27 -rw-rw-r-- 1 meillo users 0 May 12 07:32 foo |
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
28 |
4 | 29 $ ls -l foo | cut -c 2-4 |
30 rw- | |
0 | 31 |
4 | 32 Oder die Schreibrechte des Besitzers, der Gruppe und der |
33 Welt: | |
0 | 34 |
4 | 35 $ ls -l | cut -c 3,6,9 |
36 ww- | |
0 | 37 |
21 | 38 Mit cut lassen sich aber auch Strings kürzen. |
0 | 39 |
10 | 40 $ long=12345678901234567890 |
41 $ echo "$long" | cut -c -10 | |
42 1234567890 | |
0 | 43 |
10 | 44 Dieser Befehl gibt die ersten maximal 10 Zeichen von |
21 | 45 `$long' aus. (Alternativ kann man hierfür `printf |
10 | 46 "%.10s\n" "$long"' verwenden.) |
0 | 47 |
4 | 48 Geht es aber nicht um die Darstellung von Zeichen, sondern um |
8 | 49 ihre Speicherung, dann ist `-c' nicht unbedingt geeignet. |
21 | 50 Früher, als US-ASCII noch die omnipräsente Zeichenkodierung |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
51 war, wurde jedes Zeichen mit genau einem |
21 | 52 Byte gespeichert. Somit selektierte `cut -c' gleichermaßen |
4 | 53 sowohl Ausgabezeichen als auch Bytes. Mit dem Aufkommen von |
54 Multibyte-Kodierungen (wie UTF-8) musste man sich jedoch von | |
21 | 55 dieser Annahme lösen. In diesem Zug bekam cut mit |
9 | 56 POSIX.2-1992 einen Bytemodus (Option `-b'). Will man |
4 | 57 also nur die ersten maximal 500 Bytes vor dem |
0 | 58 Newline-Zeichen stehen haben (und den Rest stillschweigend |
59 ignorieren), dann macht man das mit: | |
60 | |
6 | 61 $ cut -b -500 |
0 | 62 |
4 | 63 Den Rest kann man sich mit `cut -b 501-' einfangen. Diese |
21 | 64 Funktion ist insbesondere für POSIX wichtig, da man damit |
65 Textdateien mit begrenzter Zeilenlänge erzeugen kann. | |
4 | 66 [ http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html#tag_20_28_17 |
0 | 67 |
21 | 68 Wenn auch der Bytemodus neu eingeführt worden war, so sollte |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
69 er sich doch nur so verhalten wie der alte Zeichenmodus |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
70 normalerweise schon implementiert war. Beim Zeichenmodus aber |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
71 wurde eine neue Implementierungsweise gefordert. Das Problem |
19
a62964d0cc54
Verbesserungen durch diction(1) eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
18
diff
changeset
|
72 war folglich nicht, den neuen Bytemodus zu implementieren, sondern |
10 | 73 den Zeichenmodus neu zu implementieren. |
74 | |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
75 Neben dem Zeichen- und Bytemodus bietet cut noch den |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
76 Feldmodus, den man mit `-f' einleitet. Mit ihm |
21 | 77 können Felder ausgewählt werden. Das Trennzeichen (per |
78 Default der Tab) kann mit `-d' geändert werden. Es gilt in | |
79 gleicher Weise für die Eingabe und die Ausgabe. | |
0 | 80 |
21 | 81 Der typische Anwendungsfall für cut im Feldmodus ist die |
19
a62964d0cc54
Verbesserungen durch diction(1) eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
18
diff
changeset
|
82 Auswahl von Information aus der passwd-Datei. Hier z.B. der |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
83 Benutzername und seine ID: |
0 | 84 |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
85 $ cut -d: -f1,3 /etc/passwd |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
86 root:0 |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
87 bin:1 |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
88 daemon:2 |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
89 mail:8 |
9 | 90 ... |
0 | 91 |
21 | 92 (Die Argumente für die Optionen können bei cut übrigens |
93 mit Whitespace abgetrennt oder direkt angehängt folgen.) | |
0 | 94 |
21 | 95 Dieser Feldmodus ist für einfache tabellarische Dateien, |
4 | 96 wie eben die passwd, gut geeignet. Er kommt aber schnell an |
21 | 97 seine Grenzen. Gerade der häufige Fall, dass an Whitespace |
0 | 98 in Felder geteilt werden soll, wird damit nicht abgedeckt. |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
99 Der Delimiter kann bei cut nur genau ein Zeichen sein. Es kann |
19
a62964d0cc54
Verbesserungen durch diction(1) eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
18
diff
changeset
|
100 demnach nicht sowohl an Leerzeichen als auch an Tabs aufgetrennt |
a62964d0cc54
Verbesserungen durch diction(1) eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
18
diff
changeset
|
101 werden. Zudem unterteilt cut an jedem Trennzeichen. Zwei aneinander |
21 | 102 stehende Trennzeichen führen zu einem leeren Feld. Dieses |
8 | 103 Verhalten widerspricht den Erwartungen, die man an die |
104 Verarbeitung einer Datei mit Whitespace-getrennten Feldern | |
105 hat. Manche Implementierungen von cut, z.B. die von FreeBSD, | |
21 | 106 haben deshalb Erweiterungen, die das gewünschte Verhalten |
107 für Whitespace-getrennte Felder bieten. Ansonsten, d.h. wenn | |
9 | 108 man portabel bleiben will, verwendet man awk in diesen |
21 | 109 Fällen. |
0 | 110 |
4 | 111 Awk bietet noch eine weitere Funktion, die cut missen |
21 | 112 lässt: Das Tauschen der Feld-Reihenfolge in der Ausgabe. Bei |
8 | 113 cut ist die Reihenfolge der Feldauswahlangabe irrelevant; ein |
19
a62964d0cc54
Verbesserungen durch diction(1) eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
18
diff
changeset
|
114 Feld kann selbst mehrfach angegeben werden. Dementsprechend gibt |
a62964d0cc54
Verbesserungen durch diction(1) eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
18
diff
changeset
|
115 der Aufruf |
8 | 116 von `cut -c 5-8,1,4-6' die Zeichen Nummer 1, 4, 5, 6, 7 und 8 |
117 in genau dieser Reihenfolge aus. Die Auswahl entspricht damit | |
118 der Mengenlehre in der Mathematik: Jedes angegebene Feld wird | |
9 | 119 Teil der Ergebnismenge. Die Felder der Ergebnismenge sind |
19
a62964d0cc54
Verbesserungen durch diction(1) eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
18
diff
changeset
|
120 hierbei immer gleich geordnet wie in der Eingabe. Um die Worte |
16
4d8196c836d8
Referenzen eingefuegt; Todos geprueft
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
121 der Manpage von Version 8 Unix wiederzugeben: ``In data base |
9 | 122 parlance, it projects a relation.'' |
16
4d8196c836d8
Referenzen eingefuegt; Todos geprueft
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
123 [ http://man.cat-v.org/unix_8th/1/cut |
21 | 124 Cut führt demnach die Datenbankoperation Projektion auf |
125 Textdateien aus. Die Wikipedia erklärt das folgendermaßen: | |
7 | 126 |
127 Die Projektion entspricht der Projektionsabbildung aus der | |
128 Mengenlehre und kann auch Attributbeschränkung genannt | |
129 werden. Sie extrahiert einzelne Attribute aus der | |
130 ursprünglichen Attributmenge und ist somit als eine Art | |
131 Selektion auf Spaltenebene zu verstehen, das heißt, die | |
132 Projektion blendet Spalten aus. | |
133 | |
8 | 134 [ http://de.wikipedia.org/wiki/Projektion_(Informatik)#Projektion |
135 | |
7 | 136 |
0 | 137 Geschichtliches |
138 | |
4 | 139 Cut erblickte 1982 mit dem Release von UNIX System III das |
21 | 140 Licht der öffentlichen Welt. Wenn man die Quellen von System |
4 | 141 III durchforstet, findet man die Quellcodedatei cut.c mit dem |
142 Zeitstempel 1980-04-11. | |
1 | 143 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/cmd |
21 | 144 Das ist die älteste Manifestation des Programms, die ich |
145 aufstöbern konnte. Allerdings spricht die SCCS-ID im | |
20
c0e589b92c52
Vorgeschichte von cut in PWB/UNIX behandelt
markus schnalke <meillo@marmaro.de>
parents:
19
diff
changeset
|
146 Quellcode von Version 1.5. Die Vorgeschichte liegt, der Aussage |
c0e589b92c52
Vorgeschichte von cut in PWB/UNIX behandelt
markus schnalke <meillo@marmaro.de>
parents:
19
diff
changeset
|
147 Doug McIlroys |
c0e589b92c52
Vorgeschichte von cut in PWB/UNIX behandelt
markus schnalke <meillo@marmaro.de>
parents:
19
diff
changeset
|
148 [ XXX |
21 | 149 zufolge, in PWB/UNIX, das die Grundlage für System III war. |
20
c0e589b92c52
Vorgeschichte von cut in PWB/UNIX behandelt
markus schnalke <meillo@marmaro.de>
parents:
19
diff
changeset
|
150 (PWB 3.0 entspricht System III.) In den von PWB 1.0 (1977) |
21 | 151 verfügbaren Quellen |
20
c0e589b92c52
Vorgeschichte von cut in PWB/UNIX behandelt
markus schnalke <meillo@marmaro.de>
parents:
19
diff
changeset
|
152 [ XXX |
c0e589b92c52
Vorgeschichte von cut in PWB/UNIX behandelt
markus schnalke <meillo@marmaro.de>
parents:
19
diff
changeset
|
153 ist cut noch nicht zu finden; von PWB 2.0 sind mir keine |
21 | 154 verfügbaren Quellen oder hilfreiche Dokumentation bekannt. |
0 | 155 |
21 | 156 Nun ein Blick auf die BSD-Linie: Dort ist mein frühester |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
157 Fund ein cut.c mit dem Dateimodifikationsdatum 1986-11-07 |
8 | 158 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-UWisc/src/usr.bin/cut |
159 als Teil der Spezialversion 4.3BSD-UWisc, | |
6 | 160 [ http://gunkies.org/wiki/4.3_BSD_NFS_Wisconsin_Unix |
21 | 161 die im Januar 1987 veröffentlicht wurde. |
8 | 162 Die Implementierung unterscheidet sich nur minimal von der |
163 in System III. | |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
164 Im bekannteren 4.3BSD-Tahoe (1988) tauchte cut nicht auf. |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
165 Das darauf folgende 4.3BSD-Reno (1990) lieferte aber wieder |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
166 ein cut mit aus. Dieses cut war ein von Adam S. Moskowitz und |
8 | 167 Marciano Pitargue neu implementiertes cut, das 1989 in BSD |
168 aufgenommen wurde. | |
1 | 169 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut |
4 | 170 Seine Manpage |
1 | 171 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut/cut.1 |
21 | 172 erwähnt bereits die erwartete Konformität mit POSIX.2. |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
173 Nun muss man wissen, dass POSIX.2 erst im September |
21 | 174 1992 veröffentlicht wurde, erst gut zwei Jahren nachdem die |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
175 Manpage und das Programm geschrieben worden waren. Das Programm |
10 | 176 wurde folglich anhand von Arbeitsversionen des Standards |
21 | 177 implementiert. Ein Blick in den Code bekräftigt diese Vermutung. |
15
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
178 In der Funktion zum parsen der Feldauswahlliste findet sich |
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
179 dieser Kommentar: |
0 | 180 |
15
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
181 This parser is less restrictive than the Draft 9 POSIX spec. |
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
182 POSIX doesn't allow lists that aren't in increasing order or |
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
183 overlapping lists. |
12 | 184 |
21 | 185 Im Draft 11.2 (1991-09) fordert POSIX diese Flexibilität bereits |
15
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
186 ein: |
9 | 187 |
15
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
188 The elements in list can be repeated, can overlap, and can |
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
189 be specified in any order. |
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
190 |
21 | 191 Zudem listet Draft 11.2 alle drei Modi, während in diesem |
192 BSD cut nur die zwei alten implementiert sind. Es könnte also | |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
193 sein, dass in Draft 9 der Bytemodus noch nicht vorhanden war. |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
194 Da ich keinen Zugang zu Draft 9 oder 10 finden konnte, war es mir |
21 | 195 leider nicht möglich, diese Vermutung zu prüfen. |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
196 |
21 | 197 Die Versionsnummern und Änderungsdaten der älteren |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
198 BSD-Implementierungen kann man aus den SCCS-IDs, die vom |
21 | 199 damaligen Versionskontrollsystem in den Code eingefügt wurden, |
15
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
200 ablesen. So z.B. bei 4.3BSD-Reno: ``5.3 (Berkeley) 6/24/90''. |
12 | 201 |
21 | 202 Das cut der GNU Coreutils enthält folgenden Copyrightvermerk: |
12 | 203 |
204 Copyright (C) 1997-2015 Free Software Foundation, Inc. | |
205 Copyright (C) 1984 David M. Ihnat | |
206 | |
21 | 207 Der Code hat also recht alte Ursprünge. Wie aus weiteren |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
208 Kommentaren zu entnehmen ist, wurde der Programmcode zuerst von David |
21 | 209 MacKenzie und später von Jim Meyering überarbeitet. Letzterer |
12 | 210 hat den Code 1992 auch ins Versionkontrollsystem eingestellt. |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
211 Weshalb die Jahre vor 1997, zumindest ab 1992, nicht im |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
212 Copyright-Vermerk auftauchen, ist unklar. |
12 | 213 |
21 | 214 Trotz der vielen Jahreszahlen aus den 80er Jahren gehört cut, |
215 aus Sicht des ursprünglichen Unix, zu den jüngeren Tools. | |
216 Wenn cut auch ein Jahrzehnt älter als Linux, der Kernel, ist, | |
217 so war Unix doch schon über zehn Jahre alt, als cut das | |
218 erste Mal auftauchte. Insbesondere gehörte cut noch nicht | |
4 | 219 zu Version 7 Unix, das die Ausgangsbasis aller modernen |
220 Unix-Systeme darstellt. Die weit komplexeren Programme sed | |
221 und awk waren dort schon vertreten. Man muss sich also | |
21 | 222 fragen, warum cut überhaupt noch entwickelt wurde, wo es |
9 | 223 schon zwei Programme gab, die die Funktion von cut abdecken |
21 | 224 konnten. Ein Argument für cut war sicher seine Kompaktheit und |
225 die damit verbundene Geschwindigkeit gegenüber dem damals | |
226 trägen awk. Diese schlanke Gestalt ist es auch, die der | |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
227 Unix-Philosopie entspricht: Mache eine Aufgabe und die richtig! |
21 | 228 Cut überzeugte. Es wurde in andere Unix Varianten übernommen, |
229 standardisiert und ist heutzutage überall anzutreffen. | |
1 | 230 |
21 | 231 Die ursprüngliche Variante (ohne -b) wurde schon 1985 in |
5 | 232 der System V Interface Definition, einer wichtigen formalen |
9 | 233 Beschreibung von UNIX System V, spezifiziert und tauchte |
21 | 234 anschließend in allen relevanten Standards auf. Mit POSIX.2 |
9 | 235 im Jahre 1992 wurde cut zum ersten Mal in der heutigen Form |
236 (mit -b) standardisiert. | |
2 | 237 |
238 | |
21 | 239 Multibyte-Unterstützung |
8 | 240 |
241 Nun sind der Bytemodus und die damit verbundene | |
242 Multibyte-Verarbeitung des POSIX-Zeichenmodus bereits seit | |
243 1992 standardisiert, wie steht es aber mit deren Umsetzung? | |
10 | 244 Welche Versionen implementieren POSIX korrekt? |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
245 Die Situation ist dreiteilig: Es gibt historische |
8 | 246 Implementierungen, die nur -c und -f kennen. Dann gibt es |
10 | 247 Implementierungen die -b zwar kennen, es aber lediglich als Alias |
21 | 248 für -c handhaben. Diese Implementierungen funktionieren mit |
8 | 249 Single-Byte-Encodings (z.B. US-ASCII, Latin1) korrekt, bei |
21 | 250 Multibyte-Encodings (z.B. UTF-8) verhält sich ihr -c aber |
251 wie -b (und -n wird ignoriert). Schließlich gibt es noch | |
252 Implementierungen, die -b und -c tatsächlich POSIX-konform | |
8 | 253 implementieren. |
254 | |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
255 Historische Zwei-Modi-Implementierungen sind z.B. die von |
8 | 256 System III, System V und die aller BSDs bis in die 90er. |
257 | |
10 | 258 Pseudo-Multibyte-Implementierungen bieten GNU und die |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
259 modernen NetBSDs und OpenBSDs. Man darf sich sicher fragen, |
21 | 260 ob dort ein Schein von POSIX-Konformität gewahrt wird. |
15
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
261 Teilweise findet man erst nach genauerer Suche heraus, dass |
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
262 -c und -n nicht wie erwartet funktionieren; teilweise machen es |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
263 sich die Systeme auch einfach, indem sie auf |
21 | 264 Singlebyte-Zeichenkodierungen beharren, das aber dafür meist |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
265 klar darlegen: |
8 | 266 |
15
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
267 Since we don't support multi-byte characters, the -c and -b |
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
268 options are equivalent, and the -n option is meaningless. |
8 | 269 |
16
4d8196c836d8
Referenzen eingefuegt; Todos geprueft
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
270 [ http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/cut/cut.c?rev=1.18&content-type=text/x-cvsweb-markup |
8 | 271 |
21 | 272 Tatsächlich standardkonforme Implementierungen, die |
8 | 273 Multibytes korrekt handhaben, bekommt man bei einem modernen |
274 FreeBSD und bei den Heirloom Tools. Bei FreeBSD hat Tim Robbins | |
9 | 275 im Sommer 2004 den Zeichenmodus POSIX-konform reimplementiert. |
8 | 276 [ https://svnweb.freebsd.org/base?view=revision&revision=131194 |
21 | 277 Warum die beiden anderen großen BSDs diese Änderung nicht |
278 übernommen haben, bleibt offen. Es scheint aber an der im | |
8 | 279 obigen Kommentar formulierten Grundausrichtung zu liegen. |
280 | |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
281 Wie findet man nun als Nutzer heraus, ob beim cut(1) des eigenen |
21 | 282 Systems Multibytes korrekt unterstützt werden? Zuerst ist |
8 | 283 entscheidend, ob das System selbst mit einem Multibyte-Encoding |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
284 arbeitet, denn tut es das nicht, dann entsprechen sich |
21 | 285 Zeichen und Bytes und die Frage erübrigt sich. Man kann das |
9 | 286 herausfinden indem man sich das Locale anschaut, aber einfacher |
287 ist es, ein typisches Mehrbytezeichen, wie z.B. einen Umlaut, | |
288 auszugeben und zu schauen ob dieses in einem oder in mehreren | |
289 Bytes kodiert ist: | |
8 | 290 |
291 $ echo ä | od -c | |
292 0000000 303 244 \n | |
293 0000003 | |
294 | |
295 In diesem Fall sind es zwei Bytes: oktal 303 und 244 . (Den | |
21 | 296 Zeilenumbruch fügt echo(1) hinzu.) |
8 | 297 |
9 | 298 Mit dem Programm iconv(1) kann man Text explizit in bestimmte |
10 | 299 Kodierungen konvertieren. Hier Beispiele, wie die Ausgabe |
300 bei Latin1 und wie sie bei UTF-8 aussieht. | |
8 | 301 |
302 $ echo ä | iconv -t latin1 | od -c | |
303 0000000 344 \n | |
304 0000002 | |
305 | |
306 $ echo ä | iconv -t utf8 | od -c | |
307 0000000 303 244 \n | |
308 0000003 | |
309 | |
310 Die Ausgabe auf dem eigenen System (ohne die iconv-Konvertierung) | |
311 wird recht sicher einer dieser beiden Ausgaben entsprechen. | |
312 | |
313 Nun zum Test der cut-Implementierung. Hat man ein UTF-8-System, | |
21 | 314 dann sollte sich eine POSIX-konforme Implementierung folgendermaßen |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
315 verhalten: |
8 | 316 |
18
b1e7b45fb3c8
Anmerkungen von Michi eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
17
diff
changeset
|
317 $ echo ä | cut -c 1 | od -c |
10 | 318 0000000 303 244 \n |
8 | 319 0000003 |
320 | |
18
b1e7b45fb3c8
Anmerkungen von Michi eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
17
diff
changeset
|
321 $ echo ä | cut -b 1 | od -c |
10 | 322 0000000 303 \n |
8 | 323 0000002 |
324 | |
18
b1e7b45fb3c8
Anmerkungen von Michi eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
17
diff
changeset
|
325 $ echo ä | cut -b 1 -n | od -c |
10 | 326 0000000 \n |
327 0000001 | |
328 | |
329 Bei einer Pseudo-POSIX-Implementierung ist die Ausgabe in | |
21 | 330 allen drei Fällen wie die mittlere: Es wird das erste Byte |
10 | 331 ausgegeben. |
8 | 332 |
333 | |
334 Implementierungen | |
335 | |
9 | 336 Nun ein Blick auf den Code. Betrachtet wird eine Auswahl an |
337 Implementierungen. | |
338 | |
21 | 339 Für einen ersten Eindruck ist der Umfang des Quellcodes |
340 hilfreich. Typischerweise steigt dieser über die Jahre an. Diese | |
8 | 341 Beobachtung kann hier in der Tendenz, aber nicht in jedem Fall, |
21 | 342 bestätigt werden. Die POSIX-konforme Umsetzung des Zeichenmodus |
343 erfordert zwangsläufig mehr Code, deshalb sind diese | |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
344 Implementierungen tendenziell umfangreicher. |
8 | 345 |
346 | |
21 | 347 SLOC Zeilen Bytes Gehört zu Dateidatum Kategorie |
9 | 348 ----------------------------------------------------------------- |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
349 116 123 2966 System III 1980-04-11 (hist) |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
350 118 125 3038 4.3BSD-UWisc 1986-11-07 (hist) |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
351 200 256 5715 4.3BSD-Reno 1990-06-25 (hist) |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
352 200 270 6545 NetBSD 1993-03-21 (hist) |
9 | 353 218 290 6892 OpenBSD 2008-06-27 (pseudo) |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
354 224 296 6920 FreeBSD 1994-05-27 (hist) |
9 | 355 232 306 7500 NetBSD 2014-02-03 (pseudo) |
356 340 405 7423 Heirloom 2012-05-20 (POSIX) | |
357 382 586 14175 GNU coreutils 1992-11-08 (pseudo) | |
358 391 479 10961 FreeBSD 2012-11-24 (POSIX) | |
359 588 830 23167 GNU coreutils 2015-05-01 (pseudo) | |
8 | 360 |
361 | |
9 | 362 Das Kandidatenfeld teilt sich grob in vier Gruppen: (1) Die zwei |
21 | 363 ursprünglichen Implementierungen, die sich nur minimal |
364 unterscheiden, mit gut 100 SLOCs. (2) Die fünf BSD-Versionen mit | |
9 | 365 gut 200 SLOCs. (3) Die zwei POSIX-konformen Programme und |
21 | 366 die alte GNU-Version mit 340-390 SLOCs. Und schließlich (4) die |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
367 moderne GNU-Variante mit fast 600 SLOCs. |
9 | 368 |
369 Die Abweichung zwischen logischen Codezeilen (SLOC, ermittelt mit | |
21 | 370 SLOCcount) und der Anzahl von Zeilenumbrüchen in der Datei (`wc |
371 -l') erstreckt sich über eine Spanne von Faktor 1.06 bei den | |
372 ältesten Vertretern bis zu Faktor 1.5 bei GNU. Den größten | |
19
a62964d0cc54
Verbesserungen durch diction(1) eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
18
diff
changeset
|
373 Einfluss darauf haben Leerzeilen, reine Kommentarzeilen und |
21 | 374 die Größe des Lizenzblocks am Dateianfang. |
9 | 375 |
376 Betrachtet man die Abweichungen zwischen den logischen Codezeilen | |
21 | 377 und der Dateigröße (`wc -c'), so pendelt das Teilnehmerfeld |
9 | 378 zwischen 25 und 30 Bytes je Anweisung. Die Heirloom-Implementierung |
379 weicht mit nur 21 nach unten ab, die GNU-Implementierungen mit | |
21 | 380 fast 40 nach oben. Bei GNU liegt dies hauptsächlich an deren |
381 Programmierstil, mit spezieller Einrückung und langen Bezeichnern. | |
382 Ob man die Heirloom-Implementierung | |
383 [ XXX | |
384 als besonders kryptisch | |
9 | 385 oder als besonders elegant bezeichnen will, das soll der |
21 | 386 eigenen Einschätzung des Lesers überlassen bleiben. Vor allem |
387 der Vergleich mit einer GNU-Implementierung | |
388 [ XXX | |
389 ist eindrucksvoll. | |
8 | 390 |
391 | |
21 | 392 Die interne Struktur der Programmcodes (in C) ist meist ähnlich. |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
393 Neben der obligatorischen main-Funktion, die die Kommandozeilenargumente |
11 | 394 verarbeitet, gibt es im Normalfall eine Funktion, die die |
21 | 395 Feldauswahl in eine interne Datenstruktur überführt. Desweiteren |
396 haben fast alle Implementierungen separate Funktionen für die | |
19
a62964d0cc54
Verbesserungen durch diction(1) eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
18
diff
changeset
|
397 zwei oder drei Modi. Bei den POSIX-konformen Implementierungen |
11 | 398 wird die `-b -n'-Kombination als weiterer Modus behandelt, und |
21 | 399 damit in einer eigenen Funktion umgesetzt. Nur bei der frühen |
11 | 400 System III-Implementierung (und seiner 4.3BSD-UWisc-Variante) |
21 | 401 wird außer den Fehlerausgaben alles in der main-Funktion |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
402 erledigt. |
11 | 403 |
15
77d1f55bba08
Weitere Ueberarbeitungen
markus schnalke <meillo@marmaro.de>
parents:
13
diff
changeset
|
404 Cut-Implementierungen haben typischerweise zwei limitierende |
21 | 405 Größen: Die Maximalanzahl unterstützter Felder und die maximale |
406 Zeilenlänge. Bei System III sind beide Größen auf 512 begrenzt. | |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
407 4.3BSD-Reno und die BSDs der 90er Jahre haben ebenfalls fixe |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
408 Grenzen (_BSD_LINE_MAX bzw. _POSIX2_LINE_MAX). Bei modernen |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
409 FreeBSDs, NetBSDs, bei allen GNU-Implementierungen und bei |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
410 Heirloom kann sowohl die Felderanzahl als auch die maximale |
21 | 411 Zeilenlänge beliebig groß werden; der Speicher dafür wird |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
412 dynamisch alloziiert. OpenBSD ist ein Hybrid aus fixer |
21 | 413 Maximalzahl an Feldern, aber beliebiger Zeilenlänge. Die |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
414 begrenzte Felderanzahl scheint jedoch kein Praxisproblem |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
415 darzustellen, da _POSIX2_LINE_MAX mit mindestens 2048 durchaus |
21 | 416 groß genug sein sollte. |
11 | 417 |
8 | 418 |
2 | 419 Beschreibungen |
420 | |
19
a62964d0cc54
Verbesserungen durch diction(1) eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
18
diff
changeset
|
421 Interessant ist zudem ein Vergleich der Kurzbeschreibungen von |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
422 cut, wie sie sich in der Titelzeile der Manpages oder manchmal |
19
a62964d0cc54
Verbesserungen durch diction(1) eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
18
diff
changeset
|
423 am Anfang der Quellcodedatei finden. Die folgende Liste |
9 | 424 ist grob zeitlich geordnet und nach Abstammung gruppiert: |
3 | 425 |
426 | |
2 | 427 System III cut out selected fields of each line of a file |
3 | 428 System III (src) cut and paste columns of a table (projection of a relation) |
2 | 429 System V cut out selected fields of each line of a file |
430 HP-UX cut out (extract) selected fields of each line of a file | |
431 | |
3 | 432 4.3BSD-UWisc (src) cut and paste columns of a table (projection of a relation) |
2 | 433 4.3BSD-Reno select portions of each line of a file |
434 NetBSD select portions of each line of a file | |
7 | 435 OpenBSD 4.6 select portions of each line of a file |
2 | 436 FreeBSD 1.0 select portions of each line of a file |
10 | 437 FreeBSD 10.0 cut out selected portions of each line of a file |
2 | 438 SunOS 4.1.3 remove selected fields from each line of a file |
439 SunOS 5.5.1 cut out selected fields of each line of a file | |
440 | |
8 | 441 Heirloom Tools cut out selected fields of each line of a file |
9 | 442 Heirloom Tools (src) cut out fields of lines of files |
2 | 443 |
444 GNU coreutils remove sections from each line of files | |
445 | |
446 Minix select out columns of a file | |
447 | |
448 Version 8 Unix rearrange columns of data | |
449 ``Unix Reader'' rearrange columns of text | |
1 | 450 |
9 | 451 POSIX cut out selected fields of each line of a file |
1 | 452 |
9 | 453 |
454 Die mit ``(src)'' markierten Beschreibungen sind aus dem | |
21 | 455 jeweiligen Quellcode entnommen. Der POSIX-Eintrag enthält |
18
b1e7b45fb3c8
Anmerkungen von Michi eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
17
diff
changeset
|
456 die Beschreibung im Standard. Der ``Unix Reader'' ist ein |
21 | 457 rückblickendes Textdokument von Doug McIlroy, das das |
18
b1e7b45fb3c8
Anmerkungen von Michi eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
17
diff
changeset
|
458 Auftreten der Tools in der Geschichte des Research Unix zum |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
459 Thema hat. |
16
4d8196c836d8
Referenzen eingefuegt; Todos geprueft
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
460 [ http://doc.cat-v.org/unix/unix-reader/contents.pdf |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
461 Eigentlich sollte seine Beschreibung der in Version 8 Unix |
21 | 462 entsprechen. Die Abweichung könnte ein Übertragungsfehler |
463 oder eine nachträgliche Korrektur sein. Alle übrigen | |
19
a62964d0cc54
Verbesserungen durch diction(1) eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
18
diff
changeset
|
464 Beschreibungen entstammen den Manpages. |
5 | 465 |
21 | 466 Oft ist mit der Zeit die POSIX-Beschreibung übernommen |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
467 oder an sie angeglichen worden, wie beispielsweise bei FreeBSD. |
5 | 468 [ https://svnweb.freebsd.org/base?view=revision&revision=167101 |
469 | |
7 | 470 Interessant ist, dass die GNU coreutils seit Anbeginn vom |
5 | 471 Entfernen von Teilen der Eingabe sprechen, wohingegen die |
21 | 472 Kommandozeilenangabe klar ein Auswählen darstellt. Die |
473 Worte ``cut out'' sind vielleicht auch zu missverständlich. | |
474 HP-UX hat sie deshalb präzisiert. | |
5 | 475 |
19
a62964d0cc54
Verbesserungen durch diction(1) eingearbeitet
markus schnalke <meillo@marmaro.de>
parents:
18
diff
changeset
|
476 Beim Begriff, was selektiert wird, ist man sich ebenfalls |
17
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
477 uneins. Die Einen reden von Feldern (POSIX), Andere von |
08f539a5445d
Ueberarbeitung der Formulierungen, hauptsaechlich
markus schnalke <meillo@marmaro.de>
parents:
16
diff
changeset
|
478 Abschnitten bzw. Teilen (BSD) und wieder Andere von Spalten |
5 | 479 (Research Unix). Ironischerweise leistet sich gerade Version |
480 8 Unix, das eigentlich um eine sehr treffende Weltsicht | |
21 | 481 bemüht ist, mit ``rearrange columns of data'' die |
5 | 482 unzutreffendste der Beschreibungen. |
483 | |
484 | |
6 | 485 Autoreninfo |
486 | |
21 | 487 Markus Schnalke interessiert sich für die Hintergründe |
488 von Unix und seinen Werkzeugen. Für die Erarbeitung dieses | |
6 | 489 Textes wurde er regelrecht zum Historiker. |
490 | |
491 | |
492 Lizenz | |
10 | 493 |
6 | 494 CC0 (und kann damit auch unter CC BY-SA 4.0 Unported |
21 | 495 veröffentlicht werden) |