Listing 4
#!/bin/bash # Testdatei erzeugen echo -e "Zeile 1\nZeile 2" > datei1.txt echo "-------" cat datei1.txt echo "-------" # Suchbegriff: einstellige Zahl read -n1 -p "einstellige Zahl eingeben: " a # Durchsuchen und Folgerung echo "" cat datei1.txt | grep -q "$a" if [ $? -eq 0 ]; then echo "Zahl" $a "ist vorhanden" else echo "Zahl" $a "nicht gefunden" fi rm -r datei1.txt
Unterschiede ermitteln
Mit dem Werkzeug Diff ermitteln Sie Unterschiede zwischen zwei Textdateien. Das Tool verfügt über einige interessante Optionen, die die Tabelle “Diff-Optionen” zusammenfasst. Der Exit-Code 0 zeigt an, dass die verglichenen Dateien identisch ausfallen, 1 meldet Differenzen.
Diff-Optionen
|
Option |
Aktion |
|---|---|
|
|
Ausgabe der Unterschiede unterdrücken |
|
|
Groß/Kleinschreibung ignorieren |
|
|
führende Leerstellen ignorieren |
|
|
Tabulatoren ignorieren |
|
|
alle Leerstellen ignorieren |
|
|
Leerzeilen ignorieren |
Das in Listing 5 gezeigt Skript legt zunächst die beiden nahezu identischen Files A-Datei und B-Datei an (siehe Tabelle “Datensätze”). Beide weisen dieselbe Größe auf – auf diesem Weg lässt sich also kein Unterschied feststellen.
Datensätze
|
|
|
|---|---|
|
Hans |
Hans |
|
Christian |
Christian |
|
Anna |
Bert |
|
Maria |
Maria |
Zuerst vergleicht das Skript die beiden Datensätze durch einen Aufruf von diff (Zeile 6). Dann erstellt es unter dem Namen C-Datei eine Kopie von A-Datei (Zeile 14), die es anschließend mit dem Original vergleicht (Zeile 17). In der Ausgabe sehen Sie also die Ergebnisse von Diff sowohl für unterschiedliche (A vs. B) sowie identische (A vs. C) Dateien.
Zu guter Letzt entsorgt das Skript die nun überflüssigen Testdateien wieder (ab Zeile 25).
Listing 5
#!/bin/bash echo -e "Hans\nChristian\nAnna\nMaria" > A-Datei echo -e "Hans\nChristian\nBert\nMaria" > B-Datei echo -e "Vergleich von A-Datei und B-Datei" diff -q A-Datei B-Datei if [ $? -eq 0 ]; then echo "Dateien A-Datei und B-Datei sind identisch." else echo "" fi # Kopieren A-Datei -> C-Datei cp A-Datei C-Datei echo -e "Vergleich von A-Datei und C-Datei" diff -q A-Datei C-Datei if [ $? -eq 0 ]; then echo "Dateien A-Datei und C-Datei sind identisch." else echo "" fi # Aufräumen for datei in A B C; do rm -r $datei-Datei done
Texte verarbeiten
Wer häufig mit Texten in der Shell arbeitet, der weiß eine Reihe von kleinen Helfern rasch zu schätzen, die als Spezialisten auf reinen Textdateien arbeiten. Für die Beispiele kommt die strukturierte Datei Adressen.txt zum Einsatz (Listing 6).
Listing 6
Bayer:Anton:Hauptstraße 5:99998:Nirgendwo:25 Baier:Franz:Nebenstraße 10:99997:Auchwo:10 Müller:Karl:Rue d'Han Tien 99:93047:Ratisbonne:3 Meier:Maria:Querstraße 18:99998:Nirgendwo:43 Maier:Martina:Kreuzstraße 109:99997:Auchwo:9
Wie man unschwer erkennen kann, verhalten sich die Zeilen in den Dateien wie Datensätze, deren einzelne Felder jeweils ein bestimmtes Zeichen voneinander trennt. Mit dem Befehl cut schneiden Sie die einzelnen Felder im wortwörtlichen Sinn aus.
Die Optionen des Befehls finden Sie in der Tabelle “Cut-Optionen”. Die Ausgabe von Datenfeldern (-fFelder) erfolgt in der gleichen Reihenfolge, in der diese in der Zeile stehen. Möchten Sie davon abweichen, verwenden Sie entweder Awk oder belegen verschiedene Variablen mit jeweils einem Datenfeld.
Cut-Optionen
|
Aktion |
Option |
|---|---|
|
|
Feldtrenner angeben |
|
|
Angabe der Felder |
|
|
Zeilen ohne Felder auslassen |
|
|
Angabe der Bytes |
|
|
Angabe der Zeichen |
Das Listing 7 zeigt einige Funktionsbeispiele, wobei auch die Umlaute-Problematik zum Tragen kommt: In der UTF-8-Kodierung sind Umlautzeichen mehrere Bytes lang. Das führt dazu, dass bei der Ausgabe der ersten drei Bytes aus einem “Maier” zwar ein “Mai” wird, ein “Müller” aber zum “Mü” verkommt.
Listing 7
#!/bin/bash # Ausgabe von Name, Vorname und Ort cut -d\: -f1,2,5 < Adressen.txt echo "-" # Ausgabe der ersten 3 Bytes cut -b1-3 < Adressen.txt echo "-" # Ausgabe der ersten 3 Zeichen cut -c1-3 < Adressen.txt
Mit Awk Zeilen trennen
Anders als bei Cut geben Sie mithilfe des Tools Awk die Spalten einer strukturierten Textdatei wahlfrei aus. Das Trennzeichen definieren Sie dabei mit -FTrenner. Das Skript in Listing 8 zeigt den Gebrauch des Werkzeugs für diesen Einsatzbereich.





