Textdateien bearbeiten mit Shell-Tools

Aus LinuxUser 06/2015

Textdateien bearbeiten mit Shell-Tools

© Sergey Nivens, 123RF

Sauber verzahnt

Verbinden, trennen, umformatieren: Unter Linux gibt es zahlreiche kleine Helfer, die die Arbeit mit Textdateien perfekt beherrschen – und die dazu noch perfekt zusammenarbeiten.

Mal eben in 300 Dateien einen String in einer Datei austauschen, eine bestimmte Zeile löschen und an anderer Stelle zwei einfügen? Für den Stream Editor (Sed) kein Problem. Aber wenn es um einfachere Manipulationen geht, dann behindert die komplexe Syntax des Alleskönners mehr, als sie nutzt. Gut, dass die Vielfalt unter Linux für solche Fälle eine Reihe weiterer Tools bereithält.

Diese Alternativen sind häufig spezialisierter, weisen dafür aber eine einfachere Syntax auf. Eine Übersicht finden Sie in der Tabelle “Shell-Werkzeuge”. Sofern nicht anders angegeben, funktionieren die Tools sowohl mit einer oder mehreren Dateien als auch innerhalb einer Pipe. Manche Anwendungen überlagern sich teilweise hinsichtlich der gebotenen Funktionen.

Shell-Werkzeuge

Programm Aufgabe
cat Textdateien ausgeben, mehrere vertikal zusammenfügen
tac Textdateien in umgekehrter Reihenfolge ausgeben
head Ausgabe obere Zeilen
tail Ausgabe untere Zeilen
cut Teile einer Zeile ausgeben (Datenfelder, Bytes, feste Stellen)
awk Text in Sed-ähnlicher Weise manipulieren
grep Durchsuchen von Pipes und Textdateien
less Texte anzeigen mit Suche
wc Zeichen, Wörter oder Zeilen zählen
nl Zeilen in Ausgabe nummerieren
sort Zeilen in Ausgabe sortieren
uniq mehrfache Ausgabe aufeinanderfolgender, identischer Zeilen unterdrücken
tr Suchen und Ersetzen
od Umwandeln von Text in oktale Werte
recode Zeichensätze konvertieren
expand, unexpand Leerzeichen in Tabulatoren umwandeln und umgekehrt
paste Textdateien spaltenweise (horizontal) zusammenfügen
join Textdateien horizontal zusammenfügen, gleiche Spalten nur einmal ausgeben, nur übereinstimmende “Indexwerte” ergeben eine Ausgabe, sonst fehlerhafte Ergebnisse
split Textdatei in Teile zerlegen
csplit Textdatei in Teile zerlegen, Trennung nach vorgegebenem Muster
fold Textdatei umbrechen
diff Vergleich von Textdateien

Um die Beispiele des Artikels nachzuvollziehen, kommen die Dateien a.txt, b.txt, c.txt, d.txt und e.txt zum Einsatz, deren jeweilige Inhalte Sie den Listings 1 bis**5 entnehmen können. Sie finden diese Beispieldateien ebenso wie alle Listings zu diesem Artikel auf der Heft-DVD.

Listing 1

Bauer   Anton
Meier   Manfred
Müller  Sabine
Schmidt Rosi

Listing 2

Bauer   Autofahrer
Meier   Bahnfahrer
Müller  Autofahrer

Listing 3

Meier   Manfred
Bauer   Antonius
Müller  Sabine
Schmid  Rosi

Listing 4

Meier   Manfred
Bauer   Anton
Müller  Sabine
Bauer   Anton
Schmidt Rosi
Meier   Manfred
Müller  Sabine

Listing 5

Bauer   Anton
Meier   Manfred
Müller  Sabine
Schmidt Rosi

Alles zusammen

Cat und Tac schreiben den Inhalt einer Datei auf die Standardausgabe. Die beiden Programme unterscheiden sich dabei vor allem durch die Reihenfolge der Ausgabe: Während der Befehl cat den Dateiinhalt in der ursprünglichen Reihenfolge der Zeilen bereitstellt, dreht tac ihn um. Der Umfang der Optionen beider Tools fällt unterschiedlich aus, Cat stellt hier etwas mehr Möglichkeiten bereit (siehe Tabelle “Cat-Optionen”). Insbesondere ermöglicht es das Nummerieren der Ausgabe; Leerzeilen bezieht es dabei ein. Cat eignet sich auch dazu, Textdateien aneinanderzufügen:

$ cat Datei1 Datei2 > Zieldatei

Dazu geben Sie einfach die betreffenden Textdateien an und leiten gegebenenfalls, wie in obigem Beispiel, das Ergebnis in eine Zieldatei um.

Cat-Optionen

Option Aktion
-n alle Zeilen nummerieren
-h nur Zeilen mit Inhalt nummerieren
-s leere, zusammenhängende Leerzeilen nicht ausgeben
-E Zeilenenden mit “$” markieren
-T Tabulatoren durch “^I” anzeigen

Zum Ende kommen

Mit head geben Sie den Anfang, mit tail das Ende einer Textdatei aus. Auch bei diesem Duo unterscheiden sich die verfügbaren Optionen etwas, wie die Tabelle “Optionen von head und tail” zeigt. Sie können die beiden Befehle auf Textdateien oder in Pipes anwenden.

Head/Tail-Optionen

Optionen head tail Hinweis
-nAnzahl + + Anzahl Zeilen ausgeben
-cBytes + + Anzahl Bytes ausgeben
-v + + Dateiname in der Ausgabe
-f + Dateiende fortlaufend überwachen
-s=Sekunden + Intervall zu -f

In der Praxis kommen Head und Tail hauptsächlich zum Einsatz, um eine bestimmte Anzahl von Zeilen vom Dateianfang oder -ende auszulesen. Für die Ausgabe der ersten fünf Zeilen einer Datei oder Ausgabe nutzen Sie die folgende Form:

$ head -n5 Datei

Da es sich dabei um einen häufigen Einsatz des Programms handelt, haben die Entwickler dazu eine Kurzform implementiert:

$ head -5 Datei

Das funktioniert für den Befehl tail in gleicher Weise. Beide Programme lesen von der Standardeingabe, sodass die Möglichkeit besteht, die Ausgabe eines anderen Programms entsprechend zu begrenzen.

Tail kennt die Option -f, die es ermöglicht, Ergänzungen einer Datei laufend anzuzeigen. Dies hilft vor allem beim Betrachten von Log-Dateien in Echtzeit. Mit der Option -s bestimmen Sie das Intervall, in dem das Programm die Anzeige aktualisiert; mit [Strg]+[C] beenden Sie die Ausgabe.

Beide Programme helfen dabei, bestimmte Zeilen einer Datei oder Ausgabe anzuzeigen, die an einer relativen Position liegen:

$ tail -3 Datei | head -1

Dieses Kommando liest die drittletzte Zeile der angegebenen Datei aus; für Head funktioniert das sinngemäß entsprechend.

Teilbereiche

Den Befehl cut wenden Sie in den meisten Fällen auf strukturierte Textdateien an, um einzelne Datenfelder, Bytes oder Zeichen zu extrahieren. Bei der Ausgabe von Datenfeldern geben Sie den Trenner für die Felder an. Handelt es sich dabei um Sonderzeichen wie den Tabulator, maskieren Sie diese mit vorangestelltem Backslash (\). Die Optionen zeigt die Tabelle “Cut-Optionen”.

Cut-Optionen

Option Hinweis
-fFelder Feld bestimmen (numerisch, aufsteigend)
-cZeichen Zeichen bestimmen
-cBytes Bytes bestimmen (numerisch, aufsteigend)
-fTrenner Trenner angeben, Sonderzeichen mit \ maskieren
-s ignoriert Zeilen ohne Felder

Bei der Angabe der Felder, Bytes oder Zeichen dürfen Sie ein Minuszeichen voranstellen. Damit decken Sie alle Vorkommen bis einschließlich des angegebenen Felds, Zeichens oder Bytes ab. Ein dem Wert folgendes Minuszeichen bedeutet, dass das Tool ab diesem Feld, Zeichen oder Byte ausgibt. Steht das Minuszeichen zwischen zwei Werten, beschreibt das einen abgeschlossenen Bereich.

Mit diesen Angaben extrahieren Sie nahezu beliebige Daten aus Dateien (Listing 6). In der ersten Zeile sehen Sie, wie Sie aus strukturierten Zeilen das zweite Feld ausgeben, wenn diese als Trenner den Tabulator verwenden. Es folgt die Ausgabe der Stellen 5 bis einschließlich 8 der jeweiligen Zeile.

Listing 6

$ cut -d'\t' -f2 a.txt
$ cut -c5-8 a.txt

Alleskönner Awk

Awk bietet eigentlich wesentlich mehr Funktionen, als das Herauslösen von Feldern aus Daten. Im Gegensatz zu Cut arbeitet es aber in Bezug auf die Ausgabe der Spalten flexibler. Dies hilft unter anderem beim Einsatz von CSV-Dateien für den Druck von Serienbriefen, da Sie auf diese Weise einzelne Variablen innerhalb von Schleifen mit den Werten belegen, diese auswerten und so etwa die Anrede im Brief in Abhängigkeit der Anrede bei der Anschrift gestalten. Der Aufruf folgt in der Regel der Form aus Listing 7.

Listing 7

$ awk '{OFS="Trenner"; print $Feld, $Feld}' Datei

Listing 8 zeigt ein Beispiel für den Awk-Aufruf in einer Pipe; als Trennzeichen dient – explizit angegeben – der Tabulator. Das ginge ausnahmsweise auch ohne diese Angabe, da die Software dieses Zeichen als Standard wählt. Der Aufruf vertauscht die beiden Spalten der Datei.

Listing 8

$ awk '{OFS="\t"; print $2, $1;}' a.txt
Anton   Bauer
Manfred Meier
Sabine  Müller
Rosi    Schmidt

Durchsuchen

Mit Grep durchsuchen Sie Textdateien oder Datenströme. Innerhalb von Shell-Skripten oder im direkten Aufruf stehen zahlreiche Optionen zum Verfeinern der Ausgabe bereit. Eine Auswahl davon fasst die Tabelle “Grep-Optionen” zusammen.

Grep-Optionen

Option Aktion
Suchmuster als …
-E erweiterten regulären Ausdruck betrachten
-G gewöhnlichen regulären Ausdruck betrachten (Standard)
-P erweiterten regulären Perl-Ausdruck betrachten
Angaben zum Suchmuster und Ergebnis
-e Muster Suchmuster angeben; mehrfache Angabe bei -P nicht möglich, sonst immer
-f Datei Suchmuster aus Datei lesen
-i Groß/Kleinschreibung ignorieren
-v Zeilen ausgeben, die nicht übereinstimmen (Umkehrung)
-c Anzahl Treffer ausgeben, bei Option -v Ausgabe nicht übereinstimmender Zeilen
--color farbige Bildschirmausgabe
-n Zeilennummer
-q keine Ausgabe (für Skripte, die Rückgabewert auswerten)
Angaben zu Dateien
-l Dateinamen anstelle Fundstelle ausgeben
-L Name von Dateien ohne Treffer ausgeben
-h Dateinamen bei Ausgabe der Treffer unterdrücken
-H Angabe des Dateinamens bei Ausgabe (Standard)
-r rekursiv durch die Dateien suchen
Erweiterte Ausgabe
-A Zahl Zahl Zeilen nach Fundstelle zusätzlich ausgeben
-B Zahl Zahl Zeilen vor Fundstelle zusätzlich ausgeben
-C Zahl Zahl Zeilen vor und nach Fundstelle zusätzlich ausgeben

Die Suchbegriffe dürfen reguläre Ausdrücke enthalten. Dabei geben Sie ein Muster statt eines eindeutigen Begriffs an. In vielen Fällen kommen Sie auf verschiedenen Wegen zum gleichen Ergebnis. Für Zeichenklassen in Suchmustern verwenden Sie spezielle Kennzeichnungen (siehe Tabelle “Zeichenklassen”). Die Schreibweise erfordert doppelte, eckige Klammern.

Zeichenklassen

Ausdruck Klasse
'[[:alpha:]]' Buchstaben
'[[:alnum:]]' Buchstaben und Ziffern
'[[:digit:]]' Ziffern
'[[:space:]]' Leerzeichen
'[[:xdigit:]]' Hexadezimalziffern
'[[:cntrl:]]' Steuerzeichen
'[[:punct:]]' Satzzeichen
'[[:lower:]]' Kleinbuchstaben
'[[:upper:]]' Großbuchstaben

Grundsätzlich dürfen Sie alle Optionen innerhalb einer Pipe anwenden, sofern es sich nicht um solche handelt, die Dateien oder Verzeichnisse betreffen. Für das Programmieren von Skripten sind die Rückgabewerte wichtig: 0 steht für einen gefundenen Wert, 1 für die Fehlanzeige. Sonstige Fehler quittiert grep mit dem Exit-Code 2.

Für einen Test und als kleine Basis für Experimente bietet sich das Skript suchenmitgrep.sh aus Listing 9 an. Sie beenden es, indem Sie bei der Eingabe mittels [Strg]+[C] abbrechen.

Listing 9

#! /bin/sh
while true; do
  echo -n "Suchbegriff eingeben: ";read SUBE
  grep -q $SUBE a.txt
  RUEWE=$(echo $?)
  if [ $RUEWE -eq 0 ]; then
    echo "Suchbegriff gefunden"
  elif [ $RUEWE -eq 1 ]; then
    echo "Kein Treffer"
  fi
done

Blättern und Suchen

Ein komfortables Programm zum Blättern und Durchsuchen ist Less. Das gilt gleichermaßen für Textdateien (less Datei) wie für den Einsatz am Ende einer Pipe. Die wichtigsten Optionen führt die Tabelle “Less-Optionen” auf.

Wie Sie letztendlich mit dem Programm arbeiten, hängt vor allem von den Eigenschaften des verwendeten Terminalprogramms ab. Dies betrifft insbesondere die Navigation im Text. Sie beenden das Programm in jedem Fall mittels [Q].

Less-Optionen

Option Hinweis
-? Hilfe
-E automatisches Programmende beim Erreichen des Dateiendes, bei kurzen Inhalten keine Anzeige
-e automatisches Programmende beim zweimaligen Erreichen des Endes der Datei
-f ermöglicht Einsatz bei nicht druckbaren Zeichen
-m Anzeige der aktuellen Position im Text in Bytes oder Prozent
-M Anzeige der aktuellen Zeile im Text
-N Zeilen nummerieren
-O Datei bei Pipes: gelesenen Inhalt in Datei speichern
-o Datei bei Pipes: gelesenen Inhalt in Datei speichern, Überschreiben bestätigen
-p Muster bei Aufruf nach Muster suchen
-s aufeinanderfolgende Leerzeilen zusammenfassen
-S überlange Zeilen abschneiden

Die Navigation ähnelt jener beim beliebten Editor Vim; die Tabelle “Navigation” gibt Aufschluss über die entsprechenden Tasten. Bei den meisten Distributionen funktionieren jedoch zusätzlich die Pfeiltasten.

Navigation

Richtung Tasten
Zeile nach unten [Pfeil unten] / [Eingabe] / [J]
Seite nach unten [Bild unten] / [Leertaste]
Dokumentenende [Ende] / [Umschalt]+[G]
Dokumentenanfang [Pos1] / [1],[G]
Seite nach oben [Bild-auf] / [B]
Zeile nach oben [Pfeil-oben] / [K] / [Y]
Rest der Zeile (rechts) anzeigen [Pfeil-rechts]
Linker Rand [Pfeil-links]

Blättern Sie mit Less eine Textdatei durch, haben Sie die Möglichkeit, über [V] einen Editor zu öffnen. Falls Sie die Taste drücken, während der Pager mit der Ausgabe einer Pipe arbeitet, erscheint lediglich eine Fehlermeldung. Interessant ist die Suche: Über die Eingabe /Suchbegriff” und einen Druck auf die Eingabetaste starten Sie die Anfrage; die Ergebnisse erscheinen invers unterlegt (Abbildung 1).

Abbildung 1: Suchen Sie innerhalb von Less nach einem Begriff, hinterlegt die Software die gefundenen Stellen invers.

Abbildung 1: Suchen Sie innerhalb von Less nach einem Begriff, hinterlegt die Software die gefundenen Stellen invers.

Zählen

Das Tool Wc ist nicht nur für alle Kulturschaffenden interessant, die ihren Lohn gemäß von Zeichen, Wörtern oder Zeilen erhalten. Auch beim Vorbereiten von Ausdrucken (wie etwa mit Enscript) hilft Wc, die Werte für einige Parameter zu ermitteln. Sie wenden das Kommando direkt auf Dateien an oder nutzen es in einer Pipe. Die Optionen finden Sie in der Tabelle “Wc-Optionen”.

Wc-Optionen

Option Hinweis
-w Wörter zählen
-c Bytes zählen
-m Zeichen zählen
-l Zeilen zählen
-L Zeichenzahl der längsten Zeile

Die hier beschriebene GNU-Version von Wc kennt unter anderem die Möglichkeit, die Zeichenzahl der längsten Zeile zu ermitteln. Im Zusammenhang mit dem Erstellen von leserlichen Ausdrucken mittels Enscript oder LaTeX ist dies hinsichtlich der Wahl der Schriftgröße oder des Layouts der Seiten ein wichtiger Parameter. Rufen Sie das Programm ohne Angabe einer Option auf, erhalten Sie die Ausgabe der Zeilen-, Wort- und Byte-Anzahl.

Alles nur Nummern

Das Nummerieren von Zeilen im Druck erledigen Sie mit dem Befehl nl unabhängig vom verwendeten Editor. Das Programm arbeitet sowohl mit Textdateien als auch mit Pipes. Eine Auswahl der Optionen und Parameter finden Sie in der Tabelle “Nl-Optionen”.

Nl-Optionen

Option Hinweis
-iZahl Inkrement, Erhöhung der Zeilennummer
-vZahl Startwert
-wZahl Anzahl Spalten für die Zeilennummern
-bTyp Typ der Nummerierung
-nFormat Format bestimmen
Typen
n keine Zeile nummerieren
t keine leeren Zeilen nummerieren
a alle Zeilen nummerieren
Formate
ln linksbündig
rn rechtsbündig
rz rechtsbündig mit führenden Nullen

Mit dem Befehl aus Listing 10 nummerieren Sie alle Zeilen aus der Datei mit einem Startwert von 10 und einem Inkrement von 10, beschränkt auf eine dreistellige Ausgabe.

Listing 10

$ nl -v 10 -i10 -ba -w 3 -nrz e.txt

Sortieren

Oft benötigen Sie einen Mechanismus zum Sortieren, um mehrfach vorhandene, identische Zeilen aus einer Pipe oder Datei zu tilgen. Das erledigt sort – und hilft daneben bei allen anderen ähnlichen Arbeiten. Eine kleine Übersicht der Optionen von Sort bietet die Tabelle “Sort-Optionen”. Es geht darin nicht nur um das Sortieren, sondern vor allem darum, was Sie sortieren dürfen. Mit dem Kommando sort -u *.txt sortieren Sie den Inhalt aller im Verzeichnis vorhandenen Textdateien, wobei das Programm mehrfach vorkommende, identische Zeilen unterdrückt.

Sort-Optionen

Option Hinweis
-r umgekehrte Sortierfolge
-M nach Monatsangaben
-n numerisch sortieren
-h aufbereitete Zahlenwerte
-b führende Leerzeichen nicht beachten
-f Klein/Großschreibung nicht beachten
-t genannten Feldtrenner verwenden
-u mehrfach vorhandene, identische Zeilen nur einmal ausgeben

Identische Zeilen

Bei überquellenden Protokolldateien mit unzähligen identischen Meldungen sorgt der Befehl uniq für mehr Übersicht. Er eignet sich daneben auch zum gezielten Suchen von Dubletten. Die Tabelle “Uniq-Optionen” fasst einige wichtige Optionen für das Kommando zusammen, die Sie kennen sollten.

Uniq-Optionen

Option Hinweis
-i Groß/Kleinschreibung ignorieren
-d nur mehrfach auftretende Zeilen ausgeben
-u nur einmal vorkommende Zeilen ausgeben
-wN nur die ersten N Zeichen jeder Zeile vergleichen
-sN die ersten N Zeichen beim Vergleich überspringen
-c Anzahl der Vorkommen ausgeben

Das Listing 11 verdeutlicht anhand einiger Beispiele den Einsatz von Uniq: Zunächst legen Sie alle Textdateien zusammen, sortieren diese ineinander und ermitteln alle mehrfach vorkommenden Zeilen samt deren Anzahl (erste Zeile). Die zweite Zeile zeigt, wie Sie aus der Datenquelle alle nur einmal vorkommenden Zeilen auflisten. In der letzten Zeile sehen Sie, wie Sie alle Dubletten aus der sortierten Ausgabe entfernen und sowohl die einfach als auch die mehrfach vorkommenden Zeilen ausgeben.

Listing 11

$ sort *.txt | uniq -dc
$ sort *.txt | uniq -u
$ sort *.txt | uniq

Zeichen ersetzen

Mit dem Befehl tr ersetzen oder löschen Sie Zeichen innerhalb einer Pipe; zum Löschen verwenden Sie die Option -d. Bei Bedarf ersetzen Sie mehrere gleiche, aufeinanderfolgende Zeichen durch ein einziges (-s). Anstelle von Zeichen dürfen Sie ganze Zeichenklassen (siehe gleichnamige Tabelle) verwenden.

Wie bei Sed besteht auch bei Tr die Möglichkeit, Muster für Bereiche von Zeichen in der Form Zeichen1-Zeichen2 zu bilden. Das Ersetzen erfolgt 1:1, wobei eine Angabe beim zu ersetzenden Teil für mehrere Angaben zur Suche genügt und umgekehrt.

Sonderzeichen maskieren Sie auch hier mittels eines Backslash (\). Meist benötigen Sie den Seitenvorschub (\f), den Zeilenvorschub (\n) und den horizontalen Tabulator (\t); weitere Möglichkeiten liefert die Handbuchseite.

Das Listing 12 zeigt, wie Sie mithilfe von Tr Tabulatoren durch das Pipe-Zeichen (|) ersetzen, alle Zeichen in Großschreibung umwandeln, Umlaute durch die internationale Schreibweise ersetzen sowie Zeichen löschen. Beim Umwandeln in Großschreibung ist es wichtig, die Umlaute in der gleichen Reihenfolge anzugeben.

Listing 12

$ tr \\t \| < a.txt
Bauer|Anton
Meier|Manfred
Müller|Sabine
Schmidt|Rosi
$ tr \[:lower:]äüö \[:upper:]ÄÜÖ < a.txt
BAUER   ANTON
MEIER   MANFRED
MÜLLER  SABINE
SCHMIDT ROSI
$ tr \ü \ue < a.txt
Bauer   Anton
Meier   Manfred
Mueller Sabine
Schmidt Rosi
$ tr -d \a < a.txt
Buer    Anton
Meier   Mnfred
Müller  Sbine
Schmidt Rosi

Oktalformat

Mit dem Befehl od wandeln Sie die Ausgabe einer Pipe oder den Inhalt einer Datei in oktale Schreibweise um. Das Programm hilft bei der täglichen Arbeit beim Aufspüren von (nicht immer darstellbaren) Sonderzeichen.

Ohne Angabe einer weiteren Option erhalten Sie die Ausgabe in oktalen Bytes (Listing 13, Zeile 1 bis 6). Mit der Option -c erhalten Sie Klartext; Sonder- und Steuerzeichen zeigt das Programm aber an (Zeile 7 bis 12). Mit -x gibt Od die Daten in hexadezimaler Form aus (Listing 13, ab Zeile 13).

Listing 13

$ od a.txt
0000000 060502 062565 004562 067101 067564 005156 062515 062551
0000020 004562 060515 063156 062562 005144 141515 066274 062554
0000040 004562 060523 064542 062556 051412 064143 064555 072144
0000060 051011 071557 005151
0000066
$ od -c a.txt
0000000   B   a   u   e   r  \t   A   n   t   o   n  \n   M   e   i   e
0000020   r  \t   M   a   n   f   r   e   d  \n   M 303 274   l   l   e
0000040   r  \t   S   a   b   i   n   e  \n   S   c   h   m   i   d   t
0000060  \t   R   o   s   i  \n
0000066
$ od -x a.txt
0000000 6142 6575 0972 6e41 6f74 0a6e 654d 6569
0000020 0972 614d 666e 6572 0a64 c34d 6cbc 656c
0000040 0972 6153 6962 656e 530a 6863 696d 7464
0000060 5209 736f 0a69
0000066

Zeichensätze umwandeln

Schon seit Beginn des Computerzeitalters gibt es verschiedene Zeichenkodierungen, die nach wie vor den Datenaustausch zwischen den diversen Plattformen erschweren. Das Tool Recode ermöglicht es aber, Textdateien in die gewünschte Kodierung zu konvertieren. Zu den wohl wichtigsten Optionen es Werkzeugs gehört -l: Damit listen Sie alle Zeichensätze auf, die das kleine Programm als Quelle oder Ziel beherrscht.

Mit dem Schalter -f erzwingen Sie das Umkodieren unter allen Umständen. Hierbei ist Vorsicht geboten, weil dies möglicherweise zu einem Ergebnis führt, das sich dem Rekodieren in die Gegenrichtung dann verweigert. Mit -v erhalten Sie Informationen über den Programmlauf selbst, das Handbuch nennt weitere Optionen.

In der täglichen Praxis kopieren Sie die zu konvertierende Datei und verwenden nach Möglichkeit nicht das Original. Die korrekte Schreibweise der jeweiligen Kodierung ermitteln Sie durch recode -l. Anschließend wenden Sie den Befehl auf die Kopie an. Die Syntax lautet wie folgt:

$ recode Quellkodierung..Zielkodierung Datei

Zwischen den Angaben für Quell- und Zielkodierung setzen Sie zwei Punkte. Die Software fügt beim Umwandeln zusätzlich notwendige Steuerzeichen ein. Listing 14 zeigt eine Konvertierung vom Ausgangsformat UTF-8 nach ISO-8859-15.

Listing 14

$ recode -v UTF-8..ISO-8859-15 export.txt
Anfrage: UTF-8..:libiconv:..ISO-8859-15
Geschrumpft zu: UTF-8..ISO-8859-15
Kodiere `export.txt' um... fertig

Tabulatoren

Die beiden Befehle expand und unexpand ermöglichen das Umwandeln von Tabulatoren in Leerzeichen, sowohl in Dateien als auch in Pipes. Beide verwenden die Option -tZahl, mit der Sie die Anzahl der Leerzeichen angeben, die die Tools in die eine oder andere Richtung umwandeln. Geben Sie nichts anderes an, gelten acht Leerzeichen als Äquivalent für einen Tabulator. Bei unexpand konvertieren Sie mit -a alle Leerzeichen in Tabulatoren.

Textdateien verbinden

Textdateien eignen sich als flexibler Speicher für vielfältige Informationen. Um diese bei Bedarf zusammenzuführen, gibt es mehrere Möglichkeiten. Mit dem Befehl paste erstellen Sie aus mehreren Dateien eine Art Tabelle. Dabei bezieht das Werkzeug jede Textdatei als Spalte ein. Die Montage folgt dem Schema aus der ersten Zeile von Listing 15. Dabei nimmt die Software keine Rücksicht auf eventuell nicht zusammenpassende Zeilen.

Listing 15

$ paste a.txt c.txt > neu.txt
$ cat neu.txt
Bauer   Anton   Meier   Manfred
Meier   Manfred Bauer   Antonius
Müller  Sabine  Müller  Sabine
Schmidt Rosi    Schmid  Rosi

Mit dem Befehl join führen Sie dagegen die Zeilen zweier Tabellen über einen gemeinsamen Schlüssel zusammen. Das klappt nur dann korrekt, wenn beide Tabellen sortiert vorliegen. Einige wichtige Optionen führt die Tabelle “Join-Optionen” auf. Ohne Angabe der Felder verwendet die Software stets die erste Spalte der jeweiligen Datei als Schlüssel.

Join-Optionen

Option Hinweis
-a[1|2] nicht übereinstimmende Zeilen der ersten (1) oder zweiten Datei (2) ausgeben
-i Groß/Kleinschreibung für den Vergleich nicht beachten
-1 Feld Feld für die Verbindung mit der Datei 1
-2 Feld Feld für die Verbindung mit der Datei 2
--nocheck-order Sortierreihenfolge nicht überprüfen
--header erste Zeile jeder Datei als Kopfzeile betrachten und nicht in den Vergleich einbeziehen

Listing 16 zeigt das Zusammenfügen ohne weitere Optionen (Zeile 1). Das jeweils erste Feld fungiert dabei als Schlüssel. Der Befehl aus Zeile 5 gibt auch alle nicht zusammenfügbaren Zeilen der Datei 1 mit aus. Das Beispiel aus Zeile 10 unterdrückt die Fehlermeldung wegen fehlerhafter Sortierung und legt die Spalten fest, die der Zusammenführung dienen. Wegen des Sortierfehlers werden weitere mögliche Paarungen hier nicht ausgegeben.

Listing 16

$ join a.txt b.txt
Bauer Anton Autofahrer
Meier Manfred Bahnfahrer
Müller Sabine Autofahrer
$ join -a1 a.txt b.txt
Bauer Anton Autofahrer
Meier Manfred Bahnfahrer
Müller Sabine Autofahrer
Schmidt Rosi
$ join --nocheck-order -1 2 -2 2 a.txt c.txt
Manfred Meier Meier
Sabine Müller Müller
Rosi Schmidt Schmid

Dateien teilen

Früher war es gang und gäbe, heute muss man nur noch selten eine Datei in kleine Häppchen aufteilen. Ergibt sich jedoch die Notwendigkeit dazu, leistet das Kommando split dabei auf flexible Weise seinen Beitrag. Derart geteilte Dateien fügen Sie später bei Bedarf mit Cat wieder zusammen.

Die wichtigsten Optionen für Split finden Sie in der Tabelle “Split-Optionen”. Die Größenangaben dürfen Sie in Byte (ohne weiteren Zusatz), in KByte (K), MByte (M) oder GByte (G) vornehmen. Des Weiteren sollten Sie ein Präfix vergeben. Das Kommando hat den Aufbau split OptionenDateiPräfix; in der Pipe geben Sie als Parameter ein Minuszeichen ein.

Split-Optionen

Option Hinweis
-aZahl Länge der Dateiendung (Standard: 2)
-d numerische Dateiendungen verwenden
-lZeilen Zeilen je Datei
-bGröße Größe (in Byte) je Teildatei
-n Anzahl der Dateien (nicht mit -b oder -l kombinierbar)

Etwas anders funktioniert der Befehl csplit. Er arbeitet in gewisser Weise analog zum Kommando cut, nur dass er statt einer Zeile eine Datei vertikal anhand eines gegebenen Musters zerteilt. Über -z löscht Csplit direkt leere Teildateien; ein Präfix für die Teildateien geben Sie als Parameter der Option -f an.

Das Suchmuster definieren Sie in Form eines Ausdrucks, den Sie mit Schrägstrichen einschließen (/Muster/). Das Tool trennt die Datei beim ersten Auftreten des Suchmusters. Dazu geben Sie entweder eine Zahl an, die bestimmt, wie oft Sie die Datei aufspalten wollen, oder verwenden {*} für “beliebig oft”.

Beim Suchmuster gelten die üblichen Regeln hinsichtlich des Maskierens von Sonderzeichen in der Shell. Falls Sie die Ausgabe aus einer Pipe teilen möchten, geben Sie ein Minuszeichen anstelle des Dateinamens ein.

Für ein Beispiel kopieren Sie die Datei a.txt nach h.txt und fügen vor jeder Zeile drei Minuszeichen ein (Listing 17). Letztere dienen Csplit als Muster zum Erstellen einer Teildatei:

$ csplit h.txt -z -f "Teil." /---/ {*}

Außerdem vergibt das Kommando den abweichenden Präfix Teil. und löscht per -z leere Teildateien.

Listing 17

---
Bauer   Anton
---
Meier   Manfred
---
Müller  Sabine
---
Schmidt Rosi

Zeilen umbrechen

Möchten Sie lange Zeilen in einer Textdatei kontrolliert umbrechen, nutzen Sie dazu das Fold-Kommando:

$ fold Optionen Spalten Datei

Das funktioniert selbst innerhalb von Pipes. In diesem Fall lassen Sie den Dateinamen im Aufruf weg. Die Option -b gibt Bytes anstelle von Spalten an – damit verhindern Sie Überraschungen mit Steuerzeichen.

Um keine Wörter in der Mitte zu trennen, verwenden Sie -s als zusätzliche Option. Damit platziert das Programm den Umbruch beim ersten Leerzeichen nach einem Wort. Die neue Zeilenbreite geben Sie mit -wZahl an.

Zeilenweise vergleichen

Mit Diff stellen Sie Unterschiede zwischen Dateien fest. Einige wichtige Optionen finden Sie in der Tabelle “Diff-Optionen”. Das Programm eignet sich aber auch zum Auffinden von vollkommen identischen Dateien. Der Exitcode beträgt 0, wenn beide Dateien übereinstimmen, ansonsten 1.

Diff-Optionen

Option Hinweis
-q Meldung nur ausgeben, falls Unterschied vorliegt
-y zweispaltige Ausgabe zum Vergleichen
-s Meldung nur ausgeben, falls Dateien identisch
-i Groß/Kleinschreibung ignorieren
-E Tabulatoren ignorieren
-b Zahl der Leerzeichen ignorieren
-w sämtliche Leerzeichen ignorieren
-B leere Zeilen ignorieren

Vergleichen Sie als Beispiel die Dateien a.txt und c.txt. In Listing 18 finden Sie einige mögliche Optionen darauf angewendet. Das erste Beispiel gibt die Unterschiede nacheinander aus, im zweiten finden Sie die Darstellung spaltenweise. Das letzte zeigt die stumme Ausführung sowie die Ausgabe des Exit-Codes.

Listing 18

$ diff a.txt c.txt
1d0
< Bauer Anton
2a2
> Bauer Antonius
4c4
< Schmidt       Rosi
---
> Schmid        Rosi
$ diff -y a.txt c.txt
Bauer   Anton      <
Meier   Manfred      Meier   Manfred
                   > Bauer   Antonius
Müller  Sabine       Müller  Sabine
Schmidt Rosi       | Schmid  Rosi
$ diff -q a.txt c.txt
Dateien a.txt und c.txt sind verschieden.
$ echo $?
1

Fazit

Viele Shell-Helferlein ersetzen oder ergänzen den Stream-Editor Sed. Anders als der Allrounder widmen diese sich aber in der Regel einer speziellen Aufgabe, die sie in der Regel sehr zuverlässig erledigen. Über das Umleiten der Ausgabe kombinieren Sie die Programme nach einem bewährten Muster. 

Der Autor

Harald Zisler beschäftigt sich seit den frühen 90er-Jahren mit FreeBSD und Linux. Zu Technik- und EDV-Themen verfasst er Zeitschriftenbeiträge und Bücher. Gerade ist die dritte Auflage seines Kompendiums “Computer-Netzwerke” beim Rheinwerk-Verlag erschienen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 06/2015 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben