Textdatei-Verarbeitung
CIP Index Up Left Right

Textdatei-Bearbeitung

Sehr häufig braucht man für die verschiedensten Zwecke eine Bearbeitung von Textdateien. Man möchte z.B. aus einer tabellarischen Liste (z.B. aus dem Output von ps) eine bestimmte Spalte herausfiltern oder nur die ersten oder letzten 10 Zeilen einer Textdatei sehen oder nur die Zeilen sehen, in denen ein bestimmtes Wort steht uvm.

Ensprechend einer der Grundideen von UNIX existiert für all diese Zwecke nicht ein sehr mächtiges Programm, sondern sehr viele kleine, die man als Pipe zusammensetzt zu dem, was man braucht. Komplexere Probleme wird man vielleicht als Shellscript realisieren. Jedenfalls spart man sehr viel Zeit gegenüber dem wenn man jedes solcher kleinen Aufgaben in C programmieren müßte.

Im folgenden soll eine Auswahl der am häufigsten verwendeten Tools vorgestellt werden. Die meisten Kommandos können nicht nur mit Dateien, sondern auch mit Streams arbeiten, d.h. man kann den Input in sie "hinein-pipen": Kommando1 | Kommando2 | Kommando3 | ... Näheres dazu im Kapitel Ausgabeumlenkung.

cat file1 ...
macht nichts weiter als alle angegebenen Dateien nach stdout auszugeben. Per Ausgabeumleitung kann man so mehrere Dateien zu einer einzigen aneinanderfügen. Siehe auch paste.

head -25 filename
listet die ersten 25 Zeilen von filename, tail die letzten 25.

tail hat jedoch noch eine andere Funktionsmöglichkeit: man kann damit Veränderungen einer Datei überwachen (Option -f). D.h. alle paar Sekunden wird nachgesehen ob etwas an die Datei angefügt wurde und falls ja der neue Text ausgegeben. Siehe auch xtail, für weitergehende Möglichkeiten.

wc filename
zählt Zeilen, Wörter und Buchstaben in der Datei "filename". Mit den Optionen -l, -w und -c kann man auch nur ein Ding zählen lassen.

cut
arbeitet zeilenweise und holt aus jeder Zeile der Datei eine bestimmte Spalte heraus. Spalten können wortweise (Wörter getrennt durch ein angebbares Zeichen) oder buchstabenweise definiert werden. Man kann auch Bereiche von Spalten angeben.

colrm a b
ist das Gegenstück zu cut und kann die Spalten a bis b einer Datei entfernen. Es ist jedoch nur auf Sun/BSD vorhanden und primitiver als cut, da sich das Trennzeichen zwischen den Spalten nicht frei definieren läßt.

grep, egrep, fgrep pattern filename
(klassischer grep, extended grep, fast grep) suchen aus einer Datei alle Zeilen heraus, in denen ein Muster pattern vorkommt. Je nach grep-Version darf dieses Muster unterschiedlich komplex sein: fgrep kann nur einfache Strings, grep kann begrenzte regular expressions, wie sie auch in ed (bzw. vi) implementiert sind, egrep ist nicht eingeschränkt. Am schnellsten ist in der Regel übrigens egrep.

Bei den Suchmustern ist zu beachten, daß diese nicht wie die von der csh konstuiert werden, sondern richtige "regular expressions" sind, wie sie z.B. in der Vorlesung Automatentheorie I definiert werden. Nach einer beliebigen Zeichenkette sucht man also nicht mit "*" sondern mit ".*" Beispiele dazu in man egrep.

sort filename
sortiert die Zeilen einer Datei nach einer gewünschten Reihenfolge. Das ist per Default von links nach rechts in einer Zeile der ASCII Zeichensatz. Man kann aber auch nach bestimmten Spalten oder numerisch sortieren.
Beispiel: Die Passwortdatei in umgekehrter Reihenfolge nach den uids sortieren:
ypcat passwd | sort -t: +2 -3 -n -r | less

tr string1 string2 < input > output
liest stdin und ersetzt darin alle Vorkommen von Zeichen aus string1 durch die korrespondierenden in string2. Dabei sind begrenzt auch reguläre Ausdrücke, z.B. Bereichsangaben a-z, möglich. Beispiele sind in der manpage; man beachte die Unterschiedliche Semantik zwischen SunOS und System-V.

expand
und unexpand können eine Datei die mit Tabulatoren formatiert ist, d.h. durch Verwendung der TAB-Taste (das macht der vi sehr gerne), von den Tabs befreien oder umgekehrt. Dies empfiehlt sich z.B. vor dem Ausdrucken einer Datei, da der Drucker die Tabs garantiert anders interpretiert als der Editor, und die Datei gedruckt dann furchtbar aussieht.

paste
ist quasi das Gegenstück zu cat, mit dem man mehrere Dateien hintereinander setzen kann. paste setzt die zwei Dateien nebeneinander, d.h. es wird immer je eine Zeile aus beiden angegebenen Dateien genommen und die beiden mit einem TAB dazwischen ausgegben.

uniq
entfernt im Normalfall direkt aufeinanderfolgende identische Wiederholungen von Zeilen einer Datei. Möchte man alle Zeilen einer Datei, die identisch sind reduziert haben, muß man sie vorher mit sort sortieren! Per Option kann man sich auch nur die wiederholten Zeilen ausgeben lassen, oder nur die nicht wiederholten.

diff file1 file2
Gibt aus, was man an file1 ändern muß, um es identisch mit file2 zu machen. Gelistet werden also alle Zeilen in denen sich die Dateien unterscheiden oder die weggelassen oder hinzugekommen sind. Dazu wird bei der Ausgabe am Anfang jeder Zeile mit einem "<" bzw. ">" markiert ob eine Zeile in file1 an der angegebenen Zeilennummer gelöscht oder hinzugefügt werden muß.

Es gibt ein Kommando patch das eine diff-Ausgabe verwenden kann um aus file1 ein file2 zu konstruieren.

cmp file1 file2
Eine reduzierte Version von diff, besser geeignet für Binärdateien: Gibt nur die erste Stelle von file1 aus, wo sie sich von file2 unterscheidet.

awk
ist ein sehr mächtiges Programm, mit dem man eine Datei nach bestimmten Mustern durchsuchen kann (nicht nur per pattern matching) und auf den gefundenen Zeilen Funktionen durchführen kann. Dies dient im wesentlichen dazu, bestimmte Teile aus einer komplexen Eingabedatei herauszuholen. Die Steuerung kann bei einfachen Problemen über die Kommandozeile erfolgen, es gibt jedoch eine ganze awk-Sprache und man kann ein Programm schreiben, das die Bearbeitung einer Datei steuert.

perl

perl
ist eine Alternative für den, dem die bis jetzt genannten Kommandos noch zu schwach sind. Perl ist eine Programmiersprache, die die Fähigkeiten von C und Shell-Script vereint, und dabei die Einfachheit von BASIC bietet. Empfehlenswert für alle komplexeren Probleme der Textverarbeitung. Die meisten unserer Scripten für die Administration sind in Perl geschrieben. Näheres dazu unter man perl (200kB) oder dem Perl-Archiv der Universität von Florida und der Perl-Hypertext-Manpage (aus UK).