view cut.txt @ 0:5efb052a0d9e

Zwischenstand
author markus schnalke <meillo@marmaro.de>
date Sat, 02 May 2015 09:54:00 +0200
parents
children a3f18ccc3996
line wrap: on
line source

Das Werkzeugkaestle

#1:  cut - cut out selected fields of each line of a file
---------------------------------------------------------
markus schnalke, 2015-04


Cut ist eines der klassischen Programme im Unix-Werkzeugkasten.
In keinem ordentlichen Tutorial zur Shellprogrammierung darf
es fehlen. Es ist ein schoenes Anschauungs- und Beispielobjekt
fuer's Shellscripting. Hier soll es portraitiert werden.


Die Funktionsbasis von cut sind urspruenglich zwei Modi, die
spaeter um einen dritten erweitert wurden. Entweder cut
schneidet bestimmte Zeichen aus den Zeilen der Eingabe oder
bestimmte durch Trennzeichen definierte Felder.

Der Zeichenmodus ist besonders praktisch um bestimmte Teile
von Kommandoausgaben zu extrahieren. Ein populaeres
Beispiel ist die Jahreszahl, die aus einer Datumsangabe
herausgeschnitten werden soll, insofern das Datumsformat
nicht frei gewaehlt werden kann. Ein anderer Anwendungsfall
ist die Extraktion bestimmter Zugriffsrecht. Hier z.B. die
Rechte fuer den Besitzer:

	ls -l foo | cut -c 2-4

Oder die Schreibrechte fuer die Gruppe und alle anderen:

	ls -l | cut -c 6,9

Damit ist die grundsaetzliche Verwendung von cut
demonstriert.

Die fuer POSIX wichtige Funktion von cut ist die Faehigkeit
lange Zeilen zu kuerzen.

	cut -c -80

Dieser Befehl uebernimmt nur die ersten 80 Zeichen der
Eingabe in die Ausgabe. Der Rest der Zeilen wird einfach
abgeschnitten, koennte aber mit `cut -c 81-' extrahiert
werden.

Achtzig Zeichen erinnert unweigerlich an VT100-Terminals,
das 80 Zeichen pro Zeile darstellen kann. Geht es aber nicht
um die Darstellung von Zeichen sondern um ihre Speicherung,
dann ist `-c' nicht unbedingt die passende Option zur Kuerzung
langer Zeilen.

Frueher als US-ASCII das omnipraesente Charset und Encoding
war, war jedes Zeichen durch genau ein Byte kodiert und somit
beschnitt `cut -c' sowohl nach Ausgabezeichen als auch nach
Datenmenge. Als aber Multibyte-Kodierungen, wie UTF-8, aufkamen,
musste man sich von dieser Annahme loesen. In diesem Zug
bekam cut mit POSIX.2 die Option `-b'. Diese selektiert nach
Bytes. Will man also nur die ersten maximal 63 Bytes vor dem
Newline-Zeichen stehen haben (und den Rest stillschweigend
ignorieren), dann macht man das mit:

	cut -b -63


Neben dem Zeichen- bzw. Byte-Modus bietet cut noch den
interessanteren Feld-Modus, den man mit `-f' einleitet. Mit ihm
koennen Felder ausgewaehlt werden. Das Trennzeichen -- per
Default der Tab -- kann mit `-d' geaendert werden.

Der typische Anwendungsfall fuer den Feld-Modus. Ist die
Extraktion von Information aus der passwd-Datei. So z.B. der
Username, die User-ID und das Homeverzeichnis:

	cut -d: -f1,3,6 /etc/passwd

(Die Argumente fuer die Optionen koennen bei cut uebrigens
direkt angehaengt oder mit Whitespace abgetrennt folgen.)


Dieser Feld-Modus ist fuer einfache tabellarische Dateien
(wie eben die passwd) gut geeignet, kommt aber schnell an
seine Grenzen. Gerade der uebliche Fall, dass an Whitespace
in Felder geteilt werden soll, wird damit nicht abgedeckt.
Der Delimiter kann nur genau ein Zeichen sein. Es kann also
nicht sowohl an Leerzeichen als auch an Tabs getrennt werden.
Auch unterteilt cut an jedem Trennzeichen. Zwei aneinander
stehende Trennzeichen fuehren zu einem leeren Feld. Solches
Verhalten ist fuer Whitespace-getrennte Felder unangemessen.
Diese Aufgaben deckt aber zum Glueck awk ab, so dass die
Alternative zur Hand ist.

Awk hat eine weitere Funktion, die
cut missen laesst: Das Tauschen der Feld-Reihenfolge.





Geschichtliches

Cut erblickte in XXX das Licht der Welt. Im Verleich zu
XXX stiess es erst relativ spaet XXX

XXX ueber XXX floss
es in den XXX Standard ein, wo es seither residiert.

Standardisierung

Verbreitung