Mercurial > docs > cut
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 |