Aus Raspberry Pi Geek 02/2018

Shell-Workshop, Teil 3 (Seite 2)

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

-q

Ausgabe der Unterschiede unterdrücken

-i

Groß/Kleinschreibung ignorieren

-Z

führende Leerstellen ignorieren

-E

Tabulatoren ignorieren

-w

alle Leerstellen ignorieren

-B

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

A-Datei

B-Datei

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

-dTrennzeichen

Feldtrenner angeben

-fFelder

Angabe der Felder

-s

Zeilen ohne Felder auslassen

-bBytes

Angabe der Bytes

-cZeichen

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.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben