meillo@0: Das Werkzeugkaestle meillo@0: meillo@0: #1: cut - cut out selected fields of each line of a file meillo@0: --------------------------------------------------------- meillo@0: markus schnalke, 2015-04 meillo@0: meillo@0: meillo@1: Cut ist ein klassisches Programm im Unix-Werkzeugkasten. meillo@0: In keinem ordentlichen Tutorial zur Shellprogrammierung darf meillo@0: es fehlen. Es ist ein schoenes Anschauungs- und Beispielobjekt meillo@0: fuer's Shellscripting. Hier soll es portraitiert werden. meillo@0: meillo@0: meillo@0: Die Funktionsbasis von cut sind urspruenglich zwei Modi, die meillo@0: spaeter um einen dritten erweitert wurden. Entweder cut meillo@0: schneidet bestimmte Zeichen aus den Zeilen der Eingabe oder meillo@0: bestimmte durch Trennzeichen definierte Felder. meillo@0: meillo@0: Der Zeichenmodus ist besonders praktisch um bestimmte Teile meillo@0: von Kommandoausgaben zu extrahieren. Ein populaeres meillo@0: Beispiel ist die Jahreszahl, die aus einer Datumsangabe meillo@0: herausgeschnitten werden soll, insofern das Datumsformat meillo@0: nicht frei gewaehlt werden kann. Ein anderer Anwendungsfall meillo@0: ist die Extraktion bestimmter Zugriffsrecht. Hier z.B. die meillo@0: Rechte fuer den Besitzer: meillo@0: meillo@0: ls -l foo | cut -c 2-4 meillo@0: meillo@0: Oder die Schreibrechte fuer die Gruppe und alle anderen: meillo@0: meillo@0: ls -l | cut -c 6,9 meillo@0: meillo@0: Damit ist die grundsaetzliche Verwendung von cut meillo@0: demonstriert. meillo@0: meillo@0: Die fuer POSIX wichtige Funktion von cut ist die Faehigkeit meillo@0: lange Zeilen zu kuerzen. meillo@0: meillo@0: cut -c -80 meillo@0: meillo@0: Dieser Befehl uebernimmt nur die ersten 80 Zeichen der meillo@0: Eingabe in die Ausgabe. Der Rest der Zeilen wird einfach meillo@0: abgeschnitten, koennte aber mit `cut -c 81-' extrahiert meillo@0: werden. meillo@0: meillo@0: Achtzig Zeichen erinnert unweigerlich an VT100-Terminals, meillo@0: das 80 Zeichen pro Zeile darstellen kann. Geht es aber nicht meillo@0: um die Darstellung von Zeichen sondern um ihre Speicherung, meillo@0: dann ist `-c' nicht unbedingt die passende Option zur Kuerzung meillo@0: langer Zeilen. meillo@0: meillo@2: Frueher, als US-ASCII omnipraesente als Zeichensatz und -kodierung meillo@0: war, war jedes Zeichen durch genau ein Byte kodiert und somit meillo@2: selektierte `cut -c' sowohl nach Ausgabezeichen als auch nach meillo@2: Bytes. Mit dem Aufkommen von Multibyte-Kodierungen (wie UTF-8) meillo@0: musste man sich von dieser Annahme loesen. In diesem Zug meillo@2: bekam cut mit POSIX.2-1992 die Option `-b'. Diese selektiert meillo@1: Bytes. Will man also nur die ersten maximal 20 Bytes vor dem meillo@0: Newline-Zeichen stehen haben (und den Rest stillschweigend meillo@0: ignorieren), dann macht man das mit: meillo@0: meillo@1: cut -b -20 meillo@0: meillo@0: meillo@0: Neben dem Zeichen- bzw. Byte-Modus bietet cut noch den meillo@0: interessanteren Feld-Modus, den man mit `-f' einleitet. Mit ihm meillo@0: koennen Felder ausgewaehlt werden. Das Trennzeichen -- per meillo@0: Default der Tab -- kann mit `-d' geaendert werden. meillo@0: meillo@0: Der typische Anwendungsfall fuer den Feld-Modus. Ist die meillo@0: Extraktion von Information aus der passwd-Datei. So z.B. der meillo@0: Username, die User-ID und das Homeverzeichnis: meillo@0: meillo@0: cut -d: -f1,3,6 /etc/passwd meillo@0: meillo@0: (Die Argumente fuer die Optionen koennen bei cut uebrigens meillo@0: direkt angehaengt oder mit Whitespace abgetrennt folgen.) meillo@0: meillo@0: meillo@0: Dieser Feld-Modus ist fuer einfache tabellarische Dateien meillo@0: (wie eben die passwd) gut geeignet, kommt aber schnell an meillo@0: seine Grenzen. Gerade der uebliche Fall, dass an Whitespace meillo@0: in Felder geteilt werden soll, wird damit nicht abgedeckt. meillo@0: Der Delimiter kann nur genau ein Zeichen sein. Es kann also meillo@0: nicht sowohl an Leerzeichen als auch an Tabs getrennt werden. meillo@0: Auch unterteilt cut an jedem Trennzeichen. Zwei aneinander meillo@0: stehende Trennzeichen fuehren zu einem leeren Feld. Solches meillo@0: Verhalten ist fuer Whitespace-getrennte Felder unangemessen. meillo@0: Diese Aufgaben deckt aber zum Glueck awk ab, so dass die meillo@0: Alternative zur Hand ist. meillo@0: meillo@0: Awk hat eine weitere Funktion, die meillo@0: cut missen laesst: Das Tauschen der Feld-Reihenfolge. meillo@0: meillo@0: meillo@0: meillo@0: meillo@0: meillo@0: Geschichtliches meillo@0: meillo@1: Cut erblickte 1982 als Teil von UNIX System III das Licht der meillo@1: oeffentlichen Welt. In den Quellen von System III findet sich meillo@1: cut.c mit dem Zeitstempel 1980-04-11. meillo@1: [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/cmd meillo@0: meillo@1: Aber werfen wir doch einen Blick auf die BSD-Linie: Dort ist mein meillo@1: fruehester Fund ein cut.c mit dem Datum 1986-11-07 im Code der meillo@1: Spezialversion 4.3BSD-UWisc, die im Januar 1987 veroeffentlicht meillo@1: . meillo@1: [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-UWisc/src/usr.bin/cut meillo@1: Im bekannteren 4.3BSD-Tahoe (1988) taucht es nicht auf. Im meillo@1: darauf folgenden 4.3BSD-Reno (1990) gibt es aber wiederum ein meillo@1: cut, das von Adam S. Moskowitz und Marciano Pitargue geschrieben meillo@1: und 1989 in BSD aufgenommen worden ist. meillo@1: [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut meillo@1: Die Manpage meillo@1: [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut/cut.1 meillo@1: erwaehnt bereits die angestrebte aber noch vermutete Konformitaet meillo@1: zu POSIX.2. Man muss wissen, dass POSIX.2 erst im September meillo@2: 1992 veroeffentlicht wurde. Die Aussage basiert also auf dem meillo@1: Zwischenstand nach zweieinhalb der insgesamt fuenf Jahre, die meillo@1: die Arbeiten am Standard benoetigten. meillo@0: meillo@1: Trotz all dieser Jahreszahlen aus den 80er Jahren gehoert cut meillo@1: aus Sicht des urspruenglichen Unix zu den juengeren Tools. meillo@1: Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist, meillo@1: so existierte Unix wiederum schon ein ganzes Jahrzehnt bevor cut meillo@1: das erste Mal auftauchte. Insbesondere war cut nicht in Version 7 meillo@1: Unix vorhanden, das die Ausgangsbasis aller modernen Unix-Systeme meillo@1: darstellt. (Das weit komplexere sed z.B. war dort schon meillo@1: vertreten.) meillo@0: meillo@1: Nichts desto trotz bewaehrte sich cut. Es wurde in andere meillo@1: Unix Varianten uebernommen und ist heutzutage ueberall meillo@1: anzutreffen. meillo@1: meillo@2: Mit POSIX.2 im Jahre 1992 wurde cut zum ersten Mal in der meillo@2: heutigen Form (mit -b) standardisiert. In der urspruenglichen meillo@2: Variante (ohne -b) taucht es u.a. 1985 in der System V meillo@2: Interface Definition, einer wichtigen formalen Beschreibung meillo@2: von UNIX System V, auf. meillo@1: meillo@1: meillo@2: Beschreibungen meillo@1: meillo@2: Interessant ist ein Vergleich der Kurzbeschreibungen von cut, meillo@3: wie sie sich in der Titelzeile von Manpages oder manchmal auch meillo@2: am Anfang der Quellcodedatei findet. meillo@2: meillo@3: Die folgende Liste ist grob nach Zeit georndet und nach meillo@3: Abstammung gruppiert. Die mit ``(src)'' markierten meillo@3: Beschreibungen wurden im Code gefunden. POSIX und der ``Unix meillo@3: Reader'' sind Textdokumente, die nicht an eine bestimmte meillo@3: Unix-Version gebunden sind. Alle uebrigen Beschreibungen meillo@3: entstammen der jeweiligen Manpage. meillo@3: meillo@3: meillo@2: System III cut out selected fields of each line of a file meillo@3: System III (src) cut and paste columns of a table (projection of a relation) meillo@2: System V cut out selected fields of each line of a file meillo@2: HP-UX cut out (extract) selected fields of each line of a file meillo@2: meillo@3: 4.3BSD-UWisc (src) cut and paste columns of a table (projection of a relation) meillo@2: 4.3BSD-Reno select portions of each line of a file meillo@2: NetBSD select portions of each line of a file meillo@2: FreeBSD 1.0 select portions of each line of a file meillo@3: FreeBSD 7.0 cut out selected portions of each line of a file meillo@2: SunOS 4.1.3 remove selected fields from each line of a file meillo@2: SunOS 5.5.1 cut out selected fields of each line of a file meillo@2: meillo@2: POSIX cut out selected fields of each line of a file meillo@2: meillo@2: GNU coreutils remove sections from each line of files meillo@2: meillo@2: Minix select out columns of a file meillo@2: meillo@2: Version 8 Unix rearrange columns of data meillo@2: ``Unix Reader'' rearrange columns of text meillo@2: meillo@2: meillo@2: meillo@3: Codevergleich meillo@2: meillo@2: meillo@2: