docs/cut

annotate cut.txt @ 7:21ca59543b07

Zwischenstand
author markus schnalke <meillo@marmaro.de>
date Sun, 03 May 2015 21:05:00 +0200
parents bf2ac5df0063
children 1dc4a9dca829
rev   line source
meillo@6 1 Das Werkzeugkaestle, #1
meillo@0 2
meillo@6 3 cut - cut out selected fields of each line of a file
meillo@6 4 ----------------------------------------------------
meillo@6 5 markus schnalke <meillo@marmaro.de>
meillo@6 6 2015-05
meillo@0 7
meillo@0 8
meillo@1 9 Cut ist ein klassisches Programm im Unix-Werkzeugkasten.
meillo@0 10 In keinem ordentlichen Tutorial zur Shellprogrammierung darf
meillo@0 11 es fehlen. Es ist ein schoenes Anschauungs- und Beispielobjekt
meillo@4 12 fuer's Shellscripting. Hier will ich ein wenig hinter die
meillo@4 13 Fassade schauen.
meillo@0 14
meillo@0 15
meillo@4 16 Funktionsweise
meillo@4 17
meillo@4 18 Die Funktionsbasis von cut waren urspruenglich zwei Modi, die
meillo@4 19 spaeter um einen dritten erweitert wurden. Cut schneidet
meillo@4 20 entweder bestimmte Zeichen aus den Zeilen der Eingabe oder
meillo@0 21 bestimmte durch Trennzeichen definierte Felder.
meillo@0 22
meillo@4 23 Der Zeichenmodus ist geeignet um Ausschnitte aus
meillo@4 24 Festbreitenformaten zu extrahieren. So kann man damit
meillo@4 25 beispielsweise bestimmte Zugriffsrechte aus der Ausgabe von
meillo@4 26 `ls -l' ausschneiden. Hier die Rechte des Besitzers:
meillo@0 27
meillo@4 28 $ ls -l foo | cut -c 2-4
meillo@4 29 rw-
meillo@0 30
meillo@4 31 Oder die Schreibrechte des Besitzers, der Gruppe und der
meillo@4 32 Welt:
meillo@0 33
meillo@4 34 $ ls -l | cut -c 3,6,9
meillo@4 35 ww-
meillo@0 36
meillo@4 37 Mit cut lassen sich aber auch Strings kuerzen.
meillo@0 38
meillo@6 39 $ echo "$long" | cut -c -20
meillo@0 40
meillo@4 41 Dieser Befehl gibt die ersten maximal 20 Zeichen (jeder
meillo@4 42 Zeile) von `$long' aus.
meillo@0 43
meillo@4 44 Geht es aber nicht um die Darstellung von Zeichen, sondern um
meillo@4 45 ihre Speicherung, dann ist `-c' nicht unbedingt die passende
meillo@4 46 Option. Frueher, als US-ASCII als Zeichensatz und -kodierung
meillo@4 47 noch omnipraesent war, wurde jedes Zeichen mit genau einem
meillo@4 48 Byte gespeichert. Somit selektierte `cut -c' gleichermassen
meillo@4 49 sowohl Ausgabezeichen als auch Bytes. Mit dem Aufkommen von
meillo@4 50 Multibyte-Kodierungen (wie UTF-8) musste man sich jedoch von
meillo@4 51 dieser Annahme loesen. In diesem Zug bekam cut mit
meillo@4 52 POSIX.2-1992 die Option `-b'. Diese selektiert Bytes. Will man
meillo@4 53 also nur die ersten maximal 500 Bytes vor dem
meillo@0 54 Newline-Zeichen stehen haben (und den Rest stillschweigend
meillo@0 55 ignorieren), dann macht man das mit:
meillo@0 56
meillo@6 57 $ cut -b -500
meillo@0 58
meillo@4 59 Den Rest kann man sich mit `cut -b 501-' einfangen. Diese
meillo@4 60 Funktion ist insbesondere fuer POSIX wichtig, da so sicher
meillo@4 61 gestellt werden kann, dass Textdateien keine beliebig
meillo@4 62 langen Zeilen haben.
meillo@4 63 [ http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html#tag_20_28_17
meillo@0 64
meillo@0 65 Neben dem Zeichen- bzw. Byte-Modus bietet cut noch den
meillo@0 66 interessanteren Feld-Modus, den man mit `-f' einleitet. Mit ihm
meillo@4 67 koennen Felder ausgewaehlt werden. Das Trennzeichen (per
meillo@4 68 Default der Tab) kann mit `-d' geaendert werden.
meillo@0 69
meillo@0 70 Der typische Anwendungsfall fuer den Feld-Modus. Ist die
meillo@0 71 Extraktion von Information aus der passwd-Datei. So z.B. der
meillo@0 72 Username, die User-ID und das Homeverzeichnis:
meillo@0 73
meillo@6 74 $ cut -d: -f1,3,6 /etc/passwd
meillo@0 75
meillo@0 76 (Die Argumente fuer die Optionen koennen bei cut uebrigens
meillo@0 77 direkt angehaengt oder mit Whitespace abgetrennt folgen.)
meillo@0 78
meillo@0 79
meillo@4 80 Dieser Feld-Modus ist fuer einfache tabellarische Dateien,
meillo@4 81 wie eben die passwd, gut geeignet. Er kommt aber schnell an
meillo@0 82 seine Grenzen. Gerade der uebliche Fall, dass an Whitespace
meillo@0 83 in Felder geteilt werden soll, wird damit nicht abgedeckt.
meillo@0 84 Der Delimiter kann nur genau ein Zeichen sein. Es kann also
meillo@0 85 nicht sowohl an Leerzeichen als auch an Tabs getrennt werden.
meillo@0 86 Auch unterteilt cut an jedem Trennzeichen. Zwei aneinander
meillo@4 87 stehende Trennzeichen fuehren zu einem leeren Feld. Dieses
meillo@4 88 Verhalten widerspricht den Erwartungen fuer eine Datei mit
meillo@4 89 Whitespace-getrennten Feldern. (Manche Implementierungen von
meillo@4 90 cut, z.B. die von FreeBSD, haben deshalb Erweiterungen, die
meillo@4 91 das gewuenschte Verhalten fuer Whitespace-getrennte Felder
meillo@4 92 bieten.) Ansonsten, d.h. wenn man portabel bleiben will,
meillo@4 93 hilft awk.
meillo@0 94
meillo@4 95 Awk bietet noch eine weitere Funktion, die cut missen
meillo@4 96 laesst: Das Tauschen der Felder-Reihenfolge. Bei cut ist die
meillo@4 97 Reihenfolge der Feldauswahl irrelevant; ein Feld kann selbst
meillo@4 98 mehrfach angegeben werden. Der Aufruf von `cut -c 5-8,1,4-6'
meillo@4 99 gibt z.B. die Zeichen Nummer 1, 4, 5, 6, 7 und 8 aus. Die
meillo@4 100 Auswahl aehnelt damit der Mengenlehre in der Mathematik:
meillo@4 101 Jedes angegebene Feld soll in der Ergebnismenge sein. Die
meillo@4 102 Felder der Ergebnismenge werden dabei immer in der gleichen
meillo@4 103 Reihenfolge ausgegeben wie sie in der Eingabe waren.
meillo@0 104
meillo@0 105
meillo@7 106
meillo@7 107 cut(1) in Version 8 Unix
meillo@7 108 ``In data base parlance, it projects a relation.''
meillo@7 109
meillo@7 110 WP:
meillo@7 111 http://de.wikipedia.org/wiki/Projektion_(Informatik)#Projektion
meillo@7 112
meillo@7 113 Die Projektion entspricht der Projektionsabbildung aus der
meillo@7 114 Mengenlehre und kann auch Attributbeschränkung genannt
meillo@7 115 werden. Sie extrahiert einzelne Attribute aus der
meillo@7 116 ursprünglichen Attributmenge und ist somit als eine Art
meillo@7 117 Selektion auf Spaltenebene zu verstehen, das heißt, die
meillo@7 118 Projektion blendet Spalten aus.
meillo@7 119
meillo@7 120
meillo@7 121
meillo@7 122
meillo@0 123 Geschichtliches
meillo@0 124
meillo@4 125 Cut erblickte 1982 mit dem Release von UNIX System III das
meillo@4 126 Licht der oeffentlichen Welt. Wenn man die Quellen von System
meillo@4 127 III durchforstet, findet man die Quellcodedatei cut.c mit dem
meillo@4 128 Zeitstempel 1980-04-11.
meillo@1 129 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/cmd
meillo@4 130 Das ist die aelteste Manifestation des Programms, die ich
meillo@4 131 aufstoebern konnte.
meillo@0 132
meillo@1 133 Aber werfen wir doch einen Blick auf die BSD-Linie: Dort ist mein
meillo@1 134 fruehester Fund ein cut.c mit dem Datum 1986-11-07 im Code der
meillo@6 135 Spezialversion 4.3BSD-UWisc,
meillo@6 136 [ http://gunkies.org/wiki/4.3_BSD_NFS_Wisconsin_Unix
meillo@6 137 die im Januar 1987 veroeffentlicht wurde.
meillo@1 138 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-UWisc/src/usr.bin/cut
meillo@4 139 Die Datei unterscheidet sich nur minimal von der aus System III.
meillo@4 140 Im bekannteren 4.3BSD-Tahoe (1988) taucht cut aber nicht auf.
meillo@4 141 Im darauf folgenden 4.3BSD-Reno (1990) gibt es wiederum ein
meillo@4 142 cut ... ein von Adam S. Moskowitz und Marciano Pitargue neu
meillo@4 143 implementiertes cut, das 1989 in BSD aufgenommen wurde.
meillo@1 144 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut
meillo@4 145 Seine Manpage
meillo@1 146 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut/cut.1
meillo@4 147 erwaehnt bereits die erwartete Konformitaet mit POSIX.2.
meillo@4 148 Nun sollte man wissen, dass POSIX.2 erst im September
meillo@4 149 1992 veroeffentlicht wurde, gut zwei Jahren *nachdem* die
meillo@4 150 Manpage und das Programm geschrieben wurden. Dieses cut
meillo@4 151 wurde also anhand von Entwuerfen des Standards
meillo@4 152 implementiert. Zweieinhalb Jahre Arbeit war immerhin schon in
meillo@4 153 den Standardisierungsprozess geflossen; bis zur
meillo@4 154 Fertigstellung sollte es noch weitere zwei Jahre dauern.
meillo@0 155
meillo@1 156 Trotz all dieser Jahreszahlen aus den 80er Jahren gehoert cut
meillo@1 157 aus Sicht des urspruenglichen Unix zu den juengeren Tools.
meillo@1 158 Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist,
meillo@4 159 so war Unix doch schon ueber zehn Jahre alt, als cut das
meillo@4 160 erste Mal auftauchte. Insbesondere gehoerte cut noch nicht
meillo@4 161 zu Version 7 Unix, das die Ausgangsbasis aller modernen
meillo@4 162 Unix-Systeme darstellt. Die weit komplexeren Programme sed
meillo@4 163 und awk waren dort schon vertreten. Man muss sich also
meillo@4 164 fragen, warum cut ueberhaupt noch entwickelt wurde, wo es
meillo@4 165 schon zwei Programme gab, die die Aufgabe von cut bereits
meillo@4 166 abdeckten. Ein Argument fuer cut ist seine Kompaktheit und
meillo@4 167 die damit verbundene Geschwindigkeit gegenueber dem damals
meillo@4 168 traegen awk. Diese schlanke Gestalt ist es auch, die der Unix
meillo@4 169 Philosopie entspricht: Mache eine Aufgabe und die richtig!
meillo@4 170 So bewaehrte sich cut. Es wurde in andere Unix Varianten
meillo@4 171 uebernommen, standardisiert und ist heutzutage ueberall
meillo@1 172 anzutreffen.
meillo@1 173
meillo@5 174 Die urspruengliche Variante (ohne -b) taucht schon 1985 in
meillo@5 175 der System V Interface Definition, einer wichtigen formalen
meillo@5 176 Beschreibung von UNIX System V, und in allen relevanten
meillo@5 177 Standards seither auf. Mit POSIX.2 im Jahre 1992 wurde cut
meillo@5 178 zum ersten Mal in der heutigen Form (mit -b) standardisiert.
meillo@1 179
meillo@1 180
meillo@2 181 Beschreibungen
meillo@1 182
meillo@2 183 Interessant ist ein Vergleich der Kurzbeschreibungen von cut,
meillo@3 184 wie sie sich in der Titelzeile von Manpages oder manchmal auch
meillo@5 185 am Anfang der Quellcodedatei finden.
meillo@2 186
meillo@5 187 Die folgende Liste ist grob nach Zeit geordnet und nach
meillo@5 188 Abstammung gruppiert:
meillo@3 189
meillo@3 190
meillo@2 191 System III cut out selected fields of each line of a file
meillo@3 192 System III (src) cut and paste columns of a table (projection of a relation)
meillo@2 193 System V cut out selected fields of each line of a file
meillo@2 194 HP-UX cut out (extract) selected fields of each line of a file
meillo@2 195
meillo@3 196 4.3BSD-UWisc (src) cut and paste columns of a table (projection of a relation)
meillo@2 197 4.3BSD-Reno select portions of each line of a file
meillo@2 198 NetBSD select portions of each line of a file
meillo@7 199 OpenBSD 4.6 select portions of each line of a file
meillo@2 200 FreeBSD 1.0 select portions of each line of a file
meillo@3 201 FreeBSD 7.0 cut out selected portions of each line of a file
meillo@2 202 SunOS 4.1.3 remove selected fields from each line of a file
meillo@2 203 SunOS 5.5.1 cut out selected fields of each line of a file
meillo@2 204
meillo@2 205 POSIX cut out selected fields of each line of a file
meillo@2 206
meillo@2 207 GNU coreutils remove sections from each line of files
meillo@2 208
meillo@2 209 Minix select out columns of a file
meillo@2 210
meillo@2 211 Version 8 Unix rearrange columns of data
meillo@2 212 ``Unix Reader'' rearrange columns of text
meillo@2 213
meillo@2 214
meillo@5 215 Die zwei mit ``(src)'' markierten Beschreibungen sind aus
meillo@5 216 dem Quellcode entnommen, und verdeutlichen den Codetransfer.
meillo@5 217 POSIX ist ein Set von Standards, keine Implementierung. Der
meillo@5 218 ``Unix Reader'' ist ein rueckblickendes Textdokument von
meillo@5 219 Doug McIlroy, das das Auftreten von Tools in der Geschichte
meillo@5 220 des Research Unix zum Thema hat. Alle uebrigen Beschreibungen
meillo@5 221 entstammen den Manpages.
meillo@5 222
meillo@5 223 Zumeist ist mit der Zeit die POSIX-Beschreibung uebernommen
meillo@5 224 worden, wie beispielsweise bei FreeBSD zu sehen.
meillo@5 225 [ https://svnweb.freebsd.org/base?view=revision&revision=167101
meillo@5 226
meillo@7 227 Interessant ist, dass die GNU coreutils seit Anbeginn vom
meillo@5 228 Entfernen von Teilen der Eingabe sprechen, wohingegen die
meillo@5 229 Kommandozeilenangabe klar ein Auswaehlen darstellt. Die
meillo@5 230 Worte ``cut out'' sind vielleicht auch nicht klar genug.
meillo@5 231 HP-UX hat sie deshalb praezisiert.
meillo@5 232
meillo@5 233 Auch beim Begriff, was denn nun selektiert wird, ist man sich
meillo@5 234 uneins. Die einen reden von Feldern (POSIX), andere von
meillo@5 235 Abschnitten bzw. Teilen (BSD) und wieder andere von Spalten
meillo@5 236 (Research Unix). Ironischerweise leistet sich gerade Version
meillo@5 237 8 Unix, das eigentlich um eine sehr treffende Weltsicht
meillo@5 238 bemueht ist, mit ``rearrange columns of data'' die
meillo@5 239 unzutreffendste der Beschreibungen.
meillo@5 240
meillo@5 241
meillo@2 242
meillo@3 243 Codevergleich
meillo@2 244
meillo@7 245 Nun zum Blick auf den Code. Hier soll eine Auswahl an
meillo@7 246 Implementierungen etwas genauer betrachtet werden. Fuer einen
meillo@7 247 ersten Eindruck ist der Umfang des Quellcodes hilfreich.
meillo@7 248 Typischerweise steigt dieser ueber die Jahre an. Diese
meillo@7 249 Beobachtung kann hier in der Tendenz aber nicht in jedem Fall
meillo@7 250 bestaetigt werden. Die Unterstuetzung des Byte-Modus (-b)
meillo@7 251 erfordert zwangslaeufig mehr Code, deshalb ist zu erwarten,
meillo@7 252 dass
meillo@2 253
meillo@7 254 -b pseudo: openbsd, netbsd.2014, gnu*
meillo@7 255 -b real: freebsd.2014
meillo@2 256
meillo@7 257 :-& echo '123ä56' | cut -c -6 | od -c
meillo@7 258 0000000 1 2 3 303 244 5 \n
meillo@7 259 0000007
meillo@5 260
meillo@7 261 :-& echo '123ä56' | cut -b -6 | od -c
meillo@7 262 0000000 1 2 3 303 244 5 \n
meillo@7 263 0000007
meillo@7 264
meillo@7 265
meillo@7 266 $ wc -lc cut.c* | sort -n
meillo@6 267 123 2966 cut.c__system_iii.1980-04-11
meillo@6 268 125 3038 cut.c__4.3bsd-uwisc.1986-11-07
meillo@6 269 256 5715 cut.c__4.3bsd-reno.1990-06-25
meillo@6 270 270 6545 cut.c__netbsd.1993-03-21
meillo@7 271 290 6892 cut.c__openbsd.2008-06-27 *
meillo@6 272 296 6920 cut.c__freebsd.1994-05-27
meillo@6 273 306 7500 cut.c__netbsd.2014-02-03 *
meillo@6 274 479 10961 cut.c__freebsd.2012-11-24 *
meillo@6 275 586 14175 cut.c__gnu.1992-11-08 *
meillo@6 276 830 23167 cut.c__gnu.2015-05-01 *
meillo@6 277 3271 80987 total
meillo@6 278
meillo@7 279 $ c_count cut.c* | sort -n
meillo@6 280 Total:
meillo@6 281 116 cut.c__system_iii.1980-04-11
meillo@6 282 118 cut.c__4.3bsd-uwisc.1986-11-07
meillo@6 283 200 cut.c__4.3bsd-reno.1990-06-25
meillo@6 284 200 cut.c__netbsd.1993-03-21
meillo@7 285 218 cut.c__openbsd.2008-06-27 *
meillo@6 286 224 cut.c__freebsd.1994-05-27
meillo@6 287 232 cut.c__netbsd.2014-02-03 *
meillo@6 288 382 cut.c__gnu.1992-11-08 *
meillo@6 289 391 cut.c__freebsd.2012-11-24 *
meillo@6 290 588 cut.c__gnu.2015-05-01 *
meillo@6 291 2451
meillo@6 292
meillo@6 293 (* == version hat -b)
meillo@6 294
meillo@6 295
meillo@5 296
meillo@7 297 system_iii.1980-04-11 Release 1.5
meillo@5 298
meillo@7 299 SCCSIDs:
meillo@7 300
meillo@7 301 4.3bsd-uwisc.1986-11-07 "@(#)cut.c 1.3";
meillo@7 302 4.3bsd-reno.1990-06-25 "@(#)cut.c 5.3 (Berkeley) 6/24/90";
meillo@7 303 netbsd.1993-03-21 "@(#)cut.c 5.4 (Berkeley) 10/30/90";
meillo@7 304 freebsd.1994-05-27 "@(#)cut.c 8.1 (Berkeley) 6/6/93";
meillo@7 305
meillo@7 306 freebsd.2012-11-24 "@(#)cut.c 8.3 (Berkeley) 5/4/95";
meillo@7 307 netbsd.2014-02-03 "@(#)cut.c 8.3 (Berkeley) 5/4/95";
meillo@7 308
meillo@7 309 openbsd.2008-06-27 "@(#)cut.c 8.3 (Berkeley) 5/4/95";
meillo@7 310 "$OpenBSD: cut.c,v 1.13 2008/06/27 08:02:13 sobrado Exp $";
meillo@7 311
meillo@7 312 GNU
meillo@7 313 Copyright (C) 1997-2015 Free Software Foundation, Inc.
meillo@7 314 Copyright (C) 1984 David M. Ihnat
meillo@7 315 /* Written by David Ihnat. */
meillo@7 316
meillo@7 317 /* POSIX changes, bug fixes, long-named options, and cleanup
meillo@7 318 by David MacKenzie <djm@gnu.ai.mit.edu>.
meillo@7 319
meillo@7 320 Rewrite cut_fields and cut_bytes -- Jim Meyering. */
meillo@7 321
meillo@7 322 1992-11-08
meillo@7 323 Jim Meyering
meillo@7 324
meillo@7 325
meillo@7 326
meillo@6 327
meillo@6 328
meillo@6 329
meillo@6 330 Autoreninfo
meillo@6 331
meillo@6 332 Markus Schnalke interessiert sich fuer die Hintergruende
meillo@6 333 von Unix und seinen Werkzeugen. Fuer die Erarbeitung dieses
meillo@6 334 Textes wurde er regelrecht zum Historiker.
meillo@6 335
meillo@6 336
meillo@6 337 Lizenz
meillo@6 338 CC0 (und kann damit auch unter CC BY-SA 4.0 Unported
meillo@6 339 veroeffentlicht werden)