docs/cut

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