docs/cut

view cut.txt @ 4:d0b61c2bd25c

Zwischenstand
author markus schnalke <meillo@marmaro.de>
date Sat, 02 May 2015 22:49:00 +0200
parents 7cd149433a96
children 00097c80a853
line source
1 Das Werkzeugkaestle
3 #1: cut - cut out selected fields of each line of a file
4 ---------------------------------------------------------
5 markus schnalke, 2015-05
8 Cut ist ein klassisches Programm im Unix-Werkzeugkasten.
9 In keinem ordentlichen Tutorial zur Shellprogrammierung darf
10 es fehlen. Es ist ein schoenes Anschauungs- und Beispielobjekt
11 fuer's Shellscripting. Hier will ich ein wenig hinter die
12 Fassade schauen.
15 Funktionsweise
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
20 bestimmte durch Trennzeichen definierte Felder.
22 Der Zeichenmodus ist geeignet um Ausschnitte aus
23 Festbreitenformaten zu extrahieren. So kann man damit
24 beispielsweise bestimmte Zugriffsrechte aus der Ausgabe von
25 `ls -l' ausschneiden. Hier die Rechte des Besitzers:
27 $ ls -l foo | cut -c 2-4
28 rw-
30 Oder die Schreibrechte des Besitzers, der Gruppe und der
31 Welt:
33 $ ls -l | cut -c 3,6,9
34 ww-
36 Mit cut lassen sich aber auch Strings kuerzen.
38 echo "$long" | cut -c -20
40 Dieser Befehl gibt die ersten maximal 20 Zeichen (jeder
41 Zeile) von `$long' aus.
43 Geht es aber nicht um die Darstellung von Zeichen, sondern um
44 ihre Speicherung, dann ist `-c' nicht unbedingt die passende
45 Option. Frueher, als US-ASCII als Zeichensatz und -kodierung
46 noch omnipraesent war, wurde jedes Zeichen mit genau einem
47 Byte gespeichert. Somit selektierte `cut -c' gleichermassen
48 sowohl Ausgabezeichen als auch Bytes. Mit dem Aufkommen von
49 Multibyte-Kodierungen (wie UTF-8) musste man sich jedoch von
50 dieser Annahme loesen. In diesem Zug bekam cut mit
51 POSIX.2-1992 die Option `-b'. Diese selektiert Bytes. Will man
52 also nur die ersten maximal 500 Bytes vor dem
53 Newline-Zeichen stehen haben (und den Rest stillschweigend
54 ignorieren), dann macht man das mit:
56 cut -b -500
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 Neben dem Zeichen- bzw. Byte-Modus bietet cut noch den
65 interessanteren Feld-Modus, den man mit `-f' einleitet. Mit ihm
66 koennen Felder ausgewaehlt werden. Das Trennzeichen (per
67 Default der Tab) kann mit `-d' geaendert werden.
69 Der typische Anwendungsfall fuer den Feld-Modus. Ist die
70 Extraktion von Information aus der passwd-Datei. So z.B. der
71 Username, die User-ID und das Homeverzeichnis:
73 cut -d: -f1,3,6 /etc/passwd
75 (Die Argumente fuer die Optionen koennen bei cut uebrigens
76 direkt angehaengt oder mit Whitespace abgetrennt folgen.)
79 Dieser Feld-Modus ist fuer einfache tabellarische Dateien,
80 wie eben die passwd, gut geeignet. Er kommt aber schnell an
81 seine Grenzen. Gerade der uebliche Fall, dass an Whitespace
82 in Felder geteilt werden soll, wird damit nicht abgedeckt.
83 Der Delimiter kann nur genau ein Zeichen sein. Es kann also
84 nicht sowohl an Leerzeichen als auch an Tabs getrennt werden.
85 Auch unterteilt cut an jedem Trennzeichen. Zwei aneinander
86 stehende Trennzeichen fuehren zu einem leeren Feld. Dieses
87 Verhalten widerspricht den Erwartungen fuer eine Datei mit
88 Whitespace-getrennten Feldern. (Manche Implementierungen von
89 cut, z.B. die von FreeBSD, haben deshalb Erweiterungen, die
90 das gewuenschte Verhalten fuer Whitespace-getrennte Felder
91 bieten.) Ansonsten, d.h. wenn man portabel bleiben will,
92 hilft awk.
94 Awk bietet noch eine weitere Funktion, die cut missen
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.
105 Geschichtliches
107 Cut erblickte 1982 mit dem Release von UNIX System III das
108 Licht der oeffentlichen Welt. Wenn man die Quellen von System
109 III durchforstet, findet man die Quellcodedatei cut.c mit dem
110 Zeitstempel 1980-04-11.
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.
115 Aber werfen wir doch einen Blick auf die BSD-Linie: Dort ist mein
116 fruehester Fund ein cut.c mit dem Datum 1986-11-07 im Code der
117 Spezialversion 4.3BSD-UWisc, die im Januar 1987 veroeffentlicht
118 wurde.
119 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-UWisc/src/usr.bin/cut
120 Die Datei unterscheidet sich nur minimal von der aus System III.
121 Im bekannteren 4.3BSD-Tahoe (1988) taucht cut aber nicht auf.
122 Im darauf folgenden 4.3BSD-Reno (1990) gibt es wiederum ein
123 cut ... ein von Adam S. Moskowitz und Marciano Pitargue neu
124 implementiertes cut, das 1989 in BSD aufgenommen wurde.
125 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut
126 Seine Manpage
127 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut/cut.1
128 erwaehnt bereits die erwartete Konformitaet mit POSIX.2.
129 Nun sollte man wissen, dass POSIX.2 erst im September
130 1992 veroeffentlicht wurde, gut zwei Jahren *nachdem* die
131 Manpage und das Programm geschrieben wurden. Dieses cut
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.
137 Trotz all dieser Jahreszahlen aus den 80er Jahren gehoert cut
138 aus Sicht des urspruenglichen Unix zu den juengeren Tools.
139 Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist,
140 so war Unix doch schon ueber zehn Jahre alt, als cut das
141 erste Mal auftauchte. Insbesondere gehoerte cut noch nicht
142 zu Version 7 Unix, das die Ausgangsbasis aller modernen
143 Unix-Systeme darstellt. Die weit komplexeren Programme sed
144 und awk waren dort schon vertreten. Man muss sich also
145 fragen, warum cut ueberhaupt noch entwickelt wurde, wo es
146 schon zwei Programme gab, die die Aufgabe von cut bereits
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
153 anzutreffen.
155 Mit POSIX.2 im Jahre 1992 wurde cut zum ersten Mal in der
156 heutigen Form (mit -b) standardisiert. In der urspruenglichen
157 Variante (ohne -b) taucht es u.a. 1985 in der System V
158 Interface Definition, einer wichtigen formalen Beschreibung
159 von UNIX System V, auf.
162 Beschreibungen
164 Interessant ist ein Vergleich der Kurzbeschreibungen von cut,
165 wie sie sich in der Titelzeile von Manpages oder manchmal auch
166 am Anfang der Quellcodedatei findet.
168 Die folgende Liste ist grob nach Zeit georndet und nach
169 Abstammung gruppiert. Die mit ``(src)'' markierten
170 Beschreibungen wurden im Code gefunden. POSIX und der ``Unix
171 Reader'' sind Textdokumente, die nicht an eine bestimmte
172 Unix-Version gebunden sind. Alle uebrigen Beschreibungen
173 entstammen der jeweiligen Manpage.
176 System III cut out selected fields of each line of a file
177 System III (src) cut and paste columns of a table (projection of a relation)
178 System V cut out selected fields of each line of a file
179 HP-UX cut out (extract) selected fields of each line of a file
181 4.3BSD-UWisc (src) cut and paste columns of a table (projection of a relation)
182 4.3BSD-Reno select portions of each line of a file
183 NetBSD select portions of each line of a file
184 FreeBSD 1.0 select portions of each line of a file
185 FreeBSD 7.0 cut out selected portions of each line of a file
186 SunOS 4.1.3 remove selected fields from each line of a file
187 SunOS 5.5.1 cut out selected fields of each line of a file
189 POSIX cut out selected fields of each line of a file
191 GNU coreutils remove sections from each line of files
193 Minix select out columns of a file
195 Version 8 Unix rearrange columns of data
196 ``Unix Reader'' rearrange columns of text
200 Codevergleich