Texte mittels Filterprogrammen bearbeiten

Wichtung: 6

Beschreibung: Die Kandidaten sollen in der Lage sein, Filter auf Textströme anzuwenden.

Wichtigste Wissensgebiete:
Senden von Textdateien und anderer Ausgabeströme durch Textfilterprogramme um die Ausgabe zu modifizieren unter Benutzung der Standard-Unix-Befehle aus dem textutils-GNU-Paket.

Liste wichtiger Dateien, Verzeichnisse und Anwendungen:
cat
cut
expand
fmt
head
hexdump
join
nl
paste
pr
sed
sort
split
tac
tail
tr
unexpand
uniq
wc

cat

cat wird dazu genutzt, um den Inhalt von Dateien auf der Standard-Ausgabe auszugeben. Mit cat ist es also möglich, Dateien auf eine andere Pipe oder Gerät zu schicken:

# cat schreiben.txt Hallo Peter, wo bist du?

Folgendes Beispiel würde den Text ausdrucken:

# cat schreiben.txt > /dev/printer

tac

tac ist nichts mehr als cat umgekehrt geschrieben und gibt Dateien in umgekehrter Weise aus.

expand

Wird dazu genutzt, um Tabulatorzeichen in Leerzeichen zu verwandeln. Wird dazu genutzt, um Dateien, die durch ein ; separiert sind, in ein druckbares Format zu konvertieren.

unexpand

Arbeit genau andersherum als expand und wandelt Leerzeichen in Tabulatorzeichen.

join

join verknüpft zwei (alphabetisch) sortierte Dateien, indem je zwei Zeilen mit identischen Schlüsselfeldern zu einer Ausgabezeile verbunden werden.

Die Datei adr.txt beinhaltet Zeilen wie die folgenden:

Muster Peter Schillerstr. 23 54321 Musterhausen   Muster2 Stefan Kleistweg 34 55555 Musterhofen 

Die Datei <tt>Jobs.txt</tt> enthält jetzt etwa

 Muster Geschäftsführer   Muster2 Aufzugführer 

Beide Dateien verbunden:

 # join Adressen.txt Jobs.txt   Muster Peter Schillerstr. 23 
54321 Musterhausen Geschäftsführer Muster2 Stefan Kleistweg 34 55555 Musterhofen Aufzugführer

paste

paste verknüpft zwei oder mehrere Dateien zeilenweise, so daß die ersten Zeilen der Dateien zur ersten Zeile der Ausgabedatei werden.

Beispiel:

cut -d: -f1 /etc/passwd > Datei1   
cut -d: -f3 /etc/passwd > Datei2
paste -d: Datei2 Datei1 > Datei3

tail

Tail arbeitet wie head, nur daß nicht die ersten, sondern die letzten Zeilen einer Datei oder eines Eingabedatenstroms ausgegeben werden. Auch hier kann die gewünschte Anzahl der zu zeigenden Zeilen angegeben werden.

cut

Mit cut ist es möglich, bestimmte Spalten aus einer Textdatei herauszufiltern. Spalten in dem Sinne, dass die Textdatei durch bestimmte Texttrenner sortiert ist. Dies könnte beispielsweise eine CSV-Datei sein.

hp-laptop:/home/chef# cut --help 
Erforderliche Argumente für lange Optionen sind auch für kurze erforderlich.
-b, --bytes=LISTE nur diese Bytes ausgeben
-c, --characters=LISTE nur diese Zeichen ausgeben
-d, --delimiter=TRENN TRENN anstelle von Tabulator als Trenner benutzen
-f, --fields=LIST
-s, --only-delimited keine Zeilen ausgeben, die keinen Trenner enthalten
--ouput-delimiter=ZKETTE ZKETTE als Ausgabetrennzeichen benutzen;
Voreinstellung ist das Eingabetrennzeichen

In folgendem Beispiel soll lediglich der Text vor dem Gleichheitszeichen ausgegeben werden. Dazu geben wir das Gleichheitszeichen als Trennzeichen an (-d=) und geben die erste Spalte aus (-f1):

hp-laptop:/home/chef# cat test.txt 

SSH_AGENT_PID=2793
TERM=xterm
DESKTOP_STARTUP_ID= SHELL=/bin/bash

hp-laptop:/home/chef# cut -d= -f1 test.txt
SSH_AGENT_PID
TERM
DESKTOP_STARTUP_ID
SHELL

wc

wc steht für Wordcount und zählt die Zeilen, Wörter und Buchstaben.

hp-laptop:/home/chef# wc -w test.txt   
-c, --bytes Byteanzahl ausgeben
-m, --chars Zeichenanzahl ausgeben
-l, --lines Zeilenanzahl ausgeben
-L, --max-line-length die Länge der längsten Zeile ausgeben
-w, --words Wortanzahl ausgeben

fmt

fmt wird dazu benutzt, um Text zu formatieren. Dabei wird jeder Absatz formatiert.

hp-laptop:/home/chef# fmt --help 
Erforderliche Argumente für lange Optionen sind auch für kurze erforderlich.
-c, --crown-margin Einrückung der ersten beiden Zeilen erhalten
-p, --prefix=ZKETTE nur Zeilen mit ZKETTE als Präfix neu formatiern,
dabei ZKETTE jeder neuen Zeile voranstellen
-s, --split-only lange Zeilen umbrechen, aber nicht auffüllen
-t, --tagged-paragraph erste Zeile anders als die zweite einrücken
-u, --uniform-spacing ein Leerzeichen zwischen Wörtern, zwei nach Sätzen
-w, --width=BREITE maximale Zeilenbreite (Vorgabe: 75 Spalten)

head

head gibt standardmäßig die ersten zehn Zeilen einer Datei aus.

hp-laptop:/home/chef# head --help 
Erforderliche Argumente für lange Optionen sind auch für kurze erforderlich.
-c, --bytes=[-]N die ersten N Bytes jeder Datei ausgeben;
-n, --lines=[-]N die ersten N Zeilen ausgeben statt der ersten 10;

nl

nl nummeriert die Zeilen einer Textdatei

hp-laptop:/home/chef# nl --help 
Erforderliche Argumente für lange Optionen sind auch für kurze erforderlich.
-b, --body-numbering=STIL STIL zur Nummerierung benutzen
-d, --section-delimiter=CC CC benutzen, um logische Seiten zu trennen
-f, --footer-numbering=STIL STIL benutzen, um Fußzeilen zu nummerieren
-h, --header-numbering=STIL STIL benutzen, um Kopfzeilen zu nummerieren
-i, --page-increment=ANZAHL Zeilennummerinkrement in jeder Zeile
-l, --join-blank-lines=ANZAHL ANZAHL Leerzeilen zählen als eine
-n, --number-format=FORMAT Zeilennummern gemäß FORMAT einfügen
-p, --no-renumber logische Zeilennummer am Anfang von logischen
Seiten nicht zurücksetzen
-s, --number-separator=ZKETTE ZKETTE nach (möglicher) Zeilennummer einfügen
-v, --first-page=ANZAHL erste Zeilennummer auf jeder logischen Seite
-w, --number-width=ANZAHL ANZAHL Spalten für Zeilennummern benutzen

a alle Zeilen nummerieren
t nur nichtleere Zeilen nummerieren
n keine Zeilen nummerieren
pREGEXP nur Zeilen nummerieren, auf die die einfache REGEXP passt FORMAT ist eines der folgenden:

ln linksbündig, keine führenden Nullen
rn rechtsbündig, keine führenden Nullen
rz rechtsbündig, führende Nullen

sed

sed ist ein Streaming-Editor, der Datenströme bearbeiten kann. Er ist nützlich, um sich wiederholende Aufgaben zu erledigen, beispielsweie bestimmte Wörter und Textpassagen zu ersetzen.

Beispiel: das Wort müssen soll durch dürfen ersetzt werden:

cat test.txt | sed s/müssen/dürfen/

sort

sort wird dazu genutzt, um den Eingabestrom zu sortieren. Es ist ganz nützlich, wenn man Dateigrößen sortieren möchte, beispielsweise um herauszufinden, welche Dateien den meisten Platz auf dem System verbrauchen:

hp-laptop:/home/chef# du -m /home/chef/ | sort -n 
6 /home/chef/
3 /home/chef/.mozilla/firefox/qixe5fw2.default
3 /home/chef/.mozilla/firefox
3 /home/chef/.mozilla ...
hp-laptop:/home/chef# sort --help   
-b, --ignore-leading-blanks führende Leerzeichen ignorieren
-d, --dictionary-order nur Leer- und alphanumerische Zeichen beachten
-f, --ignore-case Klein- als Großbuchstaben behandeln
-g, --general-numeric-sort anhand des allgemeinen numerischen Wertes sortieren
-i, --ignore-nonprinting nur druckbare Zeichen beachten
-M, --month-sort Reihenfolge: (unbekannt) < JAN < ... < DEZ
-n, --numeric-sort anhand des numerischen Werts sortieren
-r, --reverse das Ergebnis der Sortierung umkehren

split

Mit split ist es möglich, eine große Datei in mehrere kleine Dateien aufzuteilen. Mit cat können diese dann wieder zu einer einzigen Datei verbunden werden:

# split -b 1m archiv.tar.gz archiv_split_ # cat archiv_split_* > archiv.tar.gz

Kurze Erklärung: Im ersten Schritt wird die Datei in 1 MB große Dateien (-b 1m) aufgeteilt. Die neuen Dateien fangen mit archiv_split_ an. Im nächsten Schritt fassen wir mit cat die neuen Dateien wieder zusammen.

hp-laptop:/home/chef/.mozilla/firefox/qixe5fw2.default# split --help 
Erforderliche Argumente für lange Optionen sind auch für kurze erforderlich.
-a, --suffix-length=N Suffixe mit Länge N verwenden (Vorgabe 2)
-b, --bytes=GRÖSSE GRÖSSE Bytes in die Ausgabedatei ausgeben
-C, --line-bytes=GRÖSSE höchstens GRÖSSE Bytes pro Zeile auf die Ausgabe schreiben
-d, --numeric-suffixes numerische Suffixe statt alphabetischer benutzen
-l, --lines=ANZAHL ANZAHL Zeilen in die Ausgabedatei ausgeben