comparison cut.txt @ 4:d0b61c2bd25c

Zwischenstand
author markus schnalke <meillo@marmaro.de>
date Sat, 02 May 2015 22:49:00 +0200
parents 7cd149433a96
children 00097c80a853
comparison
equal deleted inserted replaced
3:7cd149433a96 4:d0b61c2bd25c
1 Das Werkzeugkaestle 1 Das Werkzeugkaestle
2 2
3 #1: cut - cut out selected fields of each line of a file 3 #1: cut - cut out selected fields of each line of a file
4 --------------------------------------------------------- 4 ---------------------------------------------------------
5 markus schnalke, 2015-04 5 markus schnalke, 2015-05
6 6
7 7
8 Cut ist ein klassisches Programm im Unix-Werkzeugkasten. 8 Cut ist ein klassisches Programm im Unix-Werkzeugkasten.
9 In keinem ordentlichen Tutorial zur Shellprogrammierung darf 9 In keinem ordentlichen Tutorial zur Shellprogrammierung darf
10 es fehlen. Es ist ein schoenes Anschauungs- und Beispielobjekt 10 es fehlen. Es ist ein schoenes Anschauungs- und Beispielobjekt
11 fuer's Shellscripting. Hier soll es portraitiert werden. 11 fuer's Shellscripting. Hier will ich ein wenig hinter die
12 12 Fassade schauen.
13 13
14 Die Funktionsbasis von cut sind urspruenglich zwei Modi, die 14
15 spaeter um einen dritten erweitert wurden. Entweder cut 15 Funktionsweise
16 schneidet bestimmte Zeichen aus den Zeilen der Eingabe oder 16
17 Die Funktionsbasis von cut waren urspruenglich zwei Modi, die
18 spaeter um einen dritten erweitert wurden. Cut schneidet
19 entweder bestimmte Zeichen aus den Zeilen der Eingabe oder
17 bestimmte durch Trennzeichen definierte Felder. 20 bestimmte durch Trennzeichen definierte Felder.
18 21
19 Der Zeichenmodus ist besonders praktisch um bestimmte Teile 22 Der Zeichenmodus ist geeignet um Ausschnitte aus
20 von Kommandoausgaben zu extrahieren. Ein populaeres 23 Festbreitenformaten zu extrahieren. So kann man damit
21 Beispiel ist die Jahreszahl, die aus einer Datumsangabe 24 beispielsweise bestimmte Zugriffsrechte aus der Ausgabe von
22 herausgeschnitten werden soll, insofern das Datumsformat 25 `ls -l' ausschneiden. Hier die Rechte des Besitzers:
23 nicht frei gewaehlt werden kann. Ein anderer Anwendungsfall 26
24 ist die Extraktion bestimmter Zugriffsrecht. Hier z.B. die 27 $ ls -l foo | cut -c 2-4
25 Rechte fuer den Besitzer: 28 rw-
26 29
27 ls -l foo | cut -c 2-4 30 Oder die Schreibrechte des Besitzers, der Gruppe und der
28 31 Welt:
29 Oder die Schreibrechte fuer die Gruppe und alle anderen: 32
30 33 $ ls -l | cut -c 3,6,9
31 ls -l | cut -c 6,9 34 ww-
32 35
33 Damit ist die grundsaetzliche Verwendung von cut 36 Mit cut lassen sich aber auch Strings kuerzen.
34 demonstriert. 37
35 38 echo "$long" | cut -c -20
36 Die fuer POSIX wichtige Funktion von cut ist die Faehigkeit 39
37 lange Zeilen zu kuerzen. 40 Dieser Befehl gibt die ersten maximal 20 Zeichen (jeder
38 41 Zeile) von `$long' aus.
39 cut -c -80 42
40 43 Geht es aber nicht um die Darstellung von Zeichen, sondern um
41 Dieser Befehl uebernimmt nur die ersten 80 Zeichen der 44 ihre Speicherung, dann ist `-c' nicht unbedingt die passende
42 Eingabe in die Ausgabe. Der Rest der Zeilen wird einfach 45 Option. Frueher, als US-ASCII als Zeichensatz und -kodierung
43 abgeschnitten, koennte aber mit `cut -c 81-' extrahiert 46 noch omnipraesent war, wurde jedes Zeichen mit genau einem
44 werden. 47 Byte gespeichert. Somit selektierte `cut -c' gleichermassen
45 48 sowohl Ausgabezeichen als auch Bytes. Mit dem Aufkommen von
46 Achtzig Zeichen erinnert unweigerlich an VT100-Terminals, 49 Multibyte-Kodierungen (wie UTF-8) musste man sich jedoch von
47 das 80 Zeichen pro Zeile darstellen kann. Geht es aber nicht 50 dieser Annahme loesen. In diesem Zug bekam cut mit
48 um die Darstellung von Zeichen sondern um ihre Speicherung, 51 POSIX.2-1992 die Option `-b'. Diese selektiert Bytes. Will man
49 dann ist `-c' nicht unbedingt die passende Option zur Kuerzung 52 also nur die ersten maximal 500 Bytes vor dem
50 langer Zeilen.
51
52 Frueher, als US-ASCII omnipraesente als Zeichensatz und -kodierung
53 war, war jedes Zeichen durch genau ein Byte kodiert und somit
54 selektierte `cut -c' sowohl nach Ausgabezeichen als auch nach
55 Bytes. Mit dem Aufkommen von Multibyte-Kodierungen (wie UTF-8)
56 musste man sich von dieser Annahme loesen. In diesem Zug
57 bekam cut mit POSIX.2-1992 die Option `-b'. Diese selektiert
58 Bytes. Will man also nur die ersten maximal 20 Bytes vor dem
59 Newline-Zeichen stehen haben (und den Rest stillschweigend 53 Newline-Zeichen stehen haben (und den Rest stillschweigend
60 ignorieren), dann macht man das mit: 54 ignorieren), dann macht man das mit:
61 55
62 cut -b -20 56 cut -b -500
63 57
58 Den Rest kann man sich mit `cut -b 501-' einfangen. Diese
59 Funktion ist insbesondere fuer POSIX wichtig, da so sicher
60 gestellt werden kann, dass Textdateien keine beliebig
61 langen Zeilen haben.
62 [ http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html#tag_20_28_17
64 63
65 Neben dem Zeichen- bzw. Byte-Modus bietet cut noch den 64 Neben dem Zeichen- bzw. Byte-Modus bietet cut noch den
66 interessanteren Feld-Modus, den man mit `-f' einleitet. Mit ihm 65 interessanteren Feld-Modus, den man mit `-f' einleitet. Mit ihm
67 koennen Felder ausgewaehlt werden. Das Trennzeichen -- per 66 koennen Felder ausgewaehlt werden. Das Trennzeichen (per
68 Default der Tab -- kann mit `-d' geaendert werden. 67 Default der Tab) kann mit `-d' geaendert werden.
69 68
70 Der typische Anwendungsfall fuer den Feld-Modus. Ist die 69 Der typische Anwendungsfall fuer den Feld-Modus. Ist die
71 Extraktion von Information aus der passwd-Datei. So z.B. der 70 Extraktion von Information aus der passwd-Datei. So z.B. der
72 Username, die User-ID und das Homeverzeichnis: 71 Username, die User-ID und das Homeverzeichnis:
73 72
75 74
76 (Die Argumente fuer die Optionen koennen bei cut uebrigens 75 (Die Argumente fuer die Optionen koennen bei cut uebrigens
77 direkt angehaengt oder mit Whitespace abgetrennt folgen.) 76 direkt angehaengt oder mit Whitespace abgetrennt folgen.)
78 77
79 78
80 Dieser Feld-Modus ist fuer einfache tabellarische Dateien 79 Dieser Feld-Modus ist fuer einfache tabellarische Dateien,
81 (wie eben die passwd) gut geeignet, kommt aber schnell an 80 wie eben die passwd, gut geeignet. Er kommt aber schnell an
82 seine Grenzen. Gerade der uebliche Fall, dass an Whitespace 81 seine Grenzen. Gerade der uebliche Fall, dass an Whitespace
83 in Felder geteilt werden soll, wird damit nicht abgedeckt. 82 in Felder geteilt werden soll, wird damit nicht abgedeckt.
84 Der Delimiter kann nur genau ein Zeichen sein. Es kann also 83 Der Delimiter kann nur genau ein Zeichen sein. Es kann also
85 nicht sowohl an Leerzeichen als auch an Tabs getrennt werden. 84 nicht sowohl an Leerzeichen als auch an Tabs getrennt werden.
86 Auch unterteilt cut an jedem Trennzeichen. Zwei aneinander 85 Auch unterteilt cut an jedem Trennzeichen. Zwei aneinander
87 stehende Trennzeichen fuehren zu einem leeren Feld. Solches 86 stehende Trennzeichen fuehren zu einem leeren Feld. Dieses
88 Verhalten ist fuer Whitespace-getrennte Felder unangemessen. 87 Verhalten widerspricht den Erwartungen fuer eine Datei mit
89 Diese Aufgaben deckt aber zum Glueck awk ab, so dass die 88 Whitespace-getrennten Feldern. (Manche Implementierungen von
90 Alternative zur Hand ist. 89 cut, z.B. die von FreeBSD, haben deshalb Erweiterungen, die
91 90 das gewuenschte Verhalten fuer Whitespace-getrennte Felder
92 Awk hat eine weitere Funktion, die 91 bieten.) Ansonsten, d.h. wenn man portabel bleiben will,
93 cut missen laesst: Das Tauschen der Feld-Reihenfolge. 92 hilft awk.
94 93
95 94 Awk bietet noch eine weitere Funktion, die cut missen
96 95 laesst: Das Tauschen der Felder-Reihenfolge. Bei cut ist die
96 Reihenfolge der Feldauswahl irrelevant; ein Feld kann selbst
97 mehrfach angegeben werden. Der Aufruf von `cut -c 5-8,1,4-6'
98 gibt z.B. die Zeichen Nummer 1, 4, 5, 6, 7 und 8 aus. Die
99 Auswahl aehnelt damit der Mengenlehre in der Mathematik:
100 Jedes angegebene Feld soll in der Ergebnismenge sein. Die
101 Felder der Ergebnismenge werden dabei immer in der gleichen
102 Reihenfolge ausgegeben wie sie in der Eingabe waren.
97 103
98 104
99 Geschichtliches 105 Geschichtliches
100 106
101 Cut erblickte 1982 als Teil von UNIX System III das Licht der 107 Cut erblickte 1982 mit dem Release von UNIX System III das
102 oeffentlichen Welt. In den Quellen von System III findet sich 108 Licht der oeffentlichen Welt. Wenn man die Quellen von System
103 cut.c mit dem Zeitstempel 1980-04-11. 109 III durchforstet, findet man die Quellcodedatei cut.c mit dem
110 Zeitstempel 1980-04-11.
104 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/cmd 111 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/cmd
112 Das ist die aelteste Manifestation des Programms, die ich
113 aufstoebern konnte.
105 114
106 Aber werfen wir doch einen Blick auf die BSD-Linie: Dort ist mein 115 Aber werfen wir doch einen Blick auf die BSD-Linie: Dort ist mein
107 fruehester Fund ein cut.c mit dem Datum 1986-11-07 im Code der 116 fruehester Fund ein cut.c mit dem Datum 1986-11-07 im Code der
108 Spezialversion 4.3BSD-UWisc, die im Januar 1987 veroeffentlicht 117 Spezialversion 4.3BSD-UWisc, die im Januar 1987 veroeffentlicht
109 . 118 wurde.
110 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-UWisc/src/usr.bin/cut 119 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-UWisc/src/usr.bin/cut
111 Im bekannteren 4.3BSD-Tahoe (1988) taucht es nicht auf. Im 120 Die Datei unterscheidet sich nur minimal von der aus System III.
112 darauf folgenden 4.3BSD-Reno (1990) gibt es aber wiederum ein 121 Im bekannteren 4.3BSD-Tahoe (1988) taucht cut aber nicht auf.
113 cut, das von Adam S. Moskowitz und Marciano Pitargue geschrieben 122 Im darauf folgenden 4.3BSD-Reno (1990) gibt es wiederum ein
114 und 1989 in BSD aufgenommen worden ist. 123 cut ... ein von Adam S. Moskowitz und Marciano Pitargue neu
124 implementiertes cut, das 1989 in BSD aufgenommen wurde.
115 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut 125 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut
116 Die Manpage 126 Seine Manpage
117 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut/cut.1 127 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut/cut.1
118 erwaehnt bereits die angestrebte aber noch vermutete Konformitaet 128 erwaehnt bereits die erwartete Konformitaet mit POSIX.2.
119 zu POSIX.2. Man muss wissen, dass POSIX.2 erst im September 129 Nun sollte man wissen, dass POSIX.2 erst im September
120 1992 veroeffentlicht wurde. Die Aussage basiert also auf dem 130 1992 veroeffentlicht wurde, gut zwei Jahren *nachdem* die
121 Zwischenstand nach zweieinhalb der insgesamt fuenf Jahre, die 131 Manpage und das Programm geschrieben wurden. Dieses cut
122 die Arbeiten am Standard benoetigten. 132 wurde also anhand von Entwuerfen des Standards
133 implementiert. Zweieinhalb Jahre Arbeit war immerhin schon in
134 den Standardisierungsprozess geflossen; bis zur
135 Fertigstellung sollte es noch weitere zwei Jahre dauern.
123 136
124 Trotz all dieser Jahreszahlen aus den 80er Jahren gehoert cut 137 Trotz all dieser Jahreszahlen aus den 80er Jahren gehoert cut
125 aus Sicht des urspruenglichen Unix zu den juengeren Tools. 138 aus Sicht des urspruenglichen Unix zu den juengeren Tools.
126 Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist, 139 Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist,
127 so existierte Unix wiederum schon ein ganzes Jahrzehnt bevor cut 140 so war Unix doch schon ueber zehn Jahre alt, als cut das
128 das erste Mal auftauchte. Insbesondere war cut nicht in Version 7 141 erste Mal auftauchte. Insbesondere gehoerte cut noch nicht
129 Unix vorhanden, das die Ausgangsbasis aller modernen Unix-Systeme 142 zu Version 7 Unix, das die Ausgangsbasis aller modernen
130 darstellt. (Das weit komplexere sed z.B. war dort schon 143 Unix-Systeme darstellt. Die weit komplexeren Programme sed
131 vertreten.) 144 und awk waren dort schon vertreten. Man muss sich also
132 145 fragen, warum cut ueberhaupt noch entwickelt wurde, wo es
133 Nichts desto trotz bewaehrte sich cut. Es wurde in andere 146 schon zwei Programme gab, die die Aufgabe von cut bereits
134 Unix Varianten uebernommen und ist heutzutage ueberall 147 abdeckten. Ein Argument fuer cut ist seine Kompaktheit und
148 die damit verbundene Geschwindigkeit gegenueber dem damals
149 traegen awk. Diese schlanke Gestalt ist es auch, die der Unix
150 Philosopie entspricht: Mache eine Aufgabe und die richtig!
151 So bewaehrte sich cut. Es wurde in andere Unix Varianten
152 uebernommen, standardisiert und ist heutzutage ueberall
135 anzutreffen. 153 anzutreffen.
136 154
137 Mit POSIX.2 im Jahre 1992 wurde cut zum ersten Mal in der 155 Mit POSIX.2 im Jahre 1992 wurde cut zum ersten Mal in der
138 heutigen Form (mit -b) standardisiert. In der urspruenglichen 156 heutigen Form (mit -b) standardisiert. In der urspruenglichen
139 Variante (ohne -b) taucht es u.a. 1985 in der System V 157 Variante (ohne -b) taucht es u.a. 1985 in der System V