Einführung
Bei der Arbeit mit strukturierten Textdaten unter Linux – zum Beispiel mit Protokolldateien, CSV-Dateien oder Konfigurationsdateien – müssen Sie häufig bestimmte Informationsspalten extrahieren. Vielleicht möchten Sie beispielsweise nur die Benutzernamen aus einer Systemdatei oder die Statuscodes aus einem Webzugriffsprotokoll auslesen.
Das wichtigste Werkzeug für diese Aufgabe ist awk.
awk behandelt Text als eine Folge von Datensätzen (Zeilen) und Feldern (Spalten). Das ist ein Grund dafür, dass reiner Text unter Linux weiterhin so nützlich ist: Viele Verwaltungsdatenformate lassen sich mit bloßem Auge leicht prüfen und mit Befehlszeilenwerkzeugen einfach verarbeiten.
- Datensätze werden normalerweise durch Zeilenumbrüche getrennt.
- Felder werden normalerweise durch Leerraum (Leerzeichen oder Tabulatoren) getrennt.
Dieses Modell aus „Datensätzen und Feldern“ bildet das mentale Grundgerüst, das Ihnen das Verständnis von awk deutlich erleichtert. Statt eine Datei als unstrukturierten Text zu betrachten, sieht awk strukturierte Zeilen und Spalten, auf die direkt verwiesen werden kann.
In diesem Lab lernen Sie, wie Sie awk verwenden, um:
- Felder auszuwählen: Bestimmte Spalten mit
$1,$2usw. zu extrahieren. - Feldtrennzeichen festzulegen: Daten zu verarbeiten, die durch andere Zeichen als Leerzeichen getrennt sind, etwa durch Doppelpunkte oder Kommas, und dafür die Option
-Fzu verwenden. - Auf das letzte Feld zuzugreifen: Mit
$NFdynamisch auf das Ende einer Zeile zuzugreifen.
Das erste Feld extrahieren
Beginnen Sie mit einer einfachen, durch Leerzeichen getrennten Datei. Wir haben data.txt für Sie erstellt.
Zeigen Sie den Inhalt an:
cat data.txt
Ausgabe:
John 25 Engineer
Alice 30 Manager
Bob 22 Intern
Für awk ist jede Zeile ein Datensatz und jedes Wort ein Feld:
- Feld 1 ($1): Name (zum Beispiel John)
- Feld 2 ($2): Alter (zum Beispiel 25)
- Feld 3 ($3): Rolle (zum Beispiel Engineer)
Wenn Sie nur die Namen, also die erste Spalte, extrahieren möchten, weisen Sie awk an, $1 auszugeben.
In awk verweisen $1, $2 und ähnliche Ausdrücke auf die Felder im aktuellen Datensatz. $0 steht für die gesamte aktuelle Zeile. Diese Feldnotation ist einer der Gründe dafür, dass awk bei strukturiertem Text so kompakt eingesetzt werden kann.
Führen Sie den folgenden Befehl aus:
awk '{print $1}' data.txt
Ausgabe:
John
Alice
Bob
Speichern Sie diese Ausgabe nun in einer Datei:
awk '{print $1}' data.txt > output1.txt
Überprüfen Sie den Inhalt der neuen Datei:
cat output1.txt
Feldtrennung verstehen
Sehen wir uns nun ein anderes Dateiformat an: /etc/passwd. Diese Datei enthält Informationen zu Benutzerkonten.
Zeigen Sie den Anfang von passwd an:
head -n 3 /etc/passwd
Die Ausgabe sieht ungefähr so aus: root:x:0:0:root:/root:/bin/bash
Beachten Sie, dass keine Leerzeichen vorhanden sind. Stattdessen werden die Felder durch Doppelpunkte (:) getrennt.
Wenn Sie den standardmäßigen awk-Befehl auf diese Datei anwenden, werden die Felder nicht korrekt getrennt, da awk standardmäßig Leerzeichen erwartet.
Probieren Sie es aus:
awk '{print $1}' /etc/passwd > output2.txt
head -n 3 output2.txt
Sie werden sehen, dass die gesamte Zeile ausgegeben wird. Da awk keine Leerzeichen gefunden hat, behandelte es die gesamte Zeile als ein einziges Feld ($1).
Um dieses Problem zu beheben, müssen Sie ein benutzerdefiniertes Feldtrennzeichen angeben.
Das ist eine wichtige Erkenntnis für die Verarbeitung von Textdaten in der Praxis: Ein Werkzeug ist nur so gut wie Ihr Verständnis des Datenformats. Wenn Sie das falsche Trennzeichen auswählen, extrahieren Sie nicht die Spalten, die Sie vermuten, sondern die Spalten, die awk tatsächlich erkennt.
Ein benutzerdefiniertes Feldtrennzeichen verwenden (-F)
Um die durch Doppelpunkte getrennten Daten in nutzbare Felder aufzuteilen, verwenden Sie das Flag -F.
Der Befehl awk -F: weist awk an, das Doppelpunktzeichen als Trennzeichen zwischen den Spalten zu verwenden.
Die Option -F ändert die Art, wie awk jede Zeile verarbeitet, bevor eine Ausgabe erfolgt oder Logik ausgeführt wird. Sobald die Zeile korrekt aufgeteilt ist, sind Feldverweise wie $1 und $7 wieder aussagekräftig.
Nun können Sie bestimmte Felder extrahieren. In der Datei /etc/passwd gilt:
- Feld 1 ist der Benutzername.
- Feld 7 ist die Shell.
Extrahieren Sie nur den Benutzernamen und die Shell. Mehrere Felder geben Sie aus, indem Sie sie durch ein Komma trennen.
awk -F: '{print $1, $7}' /etc/passwd > output3.txt
Überprüfen Sie das Ergebnis:
head -n 5 output3.txt
Die Ausgabe sollte ungefähr so aussehen: root /bin/bash
awk hat die Zeile erfolgreich an den Doppelpunkten aufgeteilt und das erste und siebte Feld ausgegeben. In der Ausgabe werden die beiden Felder durch ein Leerzeichen getrennt.
Das letzte Feld ausgeben ($NF)
Manchmal wissen Sie nicht genau, wie viele Spalten eine Zeile enthält, oder die Anzahl der Spalten kann variieren. Möglicherweise wissen Sie jedoch, dass sich die gewünschten Daten immer in der letzten Spalte befinden.
awk stellt dafür eine integrierte Variable namens $NF (Number of Fields) bereit.
NFspeichert die Anzahl der Felder in der aktuellen Zeile.$NFverweist auf den Wert des letzten Feldes.
Das ist nützlich, weil Ihr Befehl dadurch weniger von fest codierten Spaltennummern abhängt. Wenn die Position vom Ende wichtiger ist als die absolute Spaltennummer, sind NF und $NF oft flexibler.
Extrahieren Sie mit $NF die letzte Spalte von /etc/passwd.
awk -F: '{print $NF}' /etc/passwd > output4.txt
Überprüfen Sie die Ausgabe:
head -n 5 output4.txt
Die Ausgabe sollte sich wieder auf die Shell beziehen, zum Beispiel auf /bin/bash, genau wie bei $7, sofern die Struktur der Datei gleich bleibt. Die Verwendung von $NF ist oft robuster, weil der Befehl sich automatisch an das Zeilenende anpasst.
Zusammenfassung
In diesem Lab haben Sie die Grundlagen der Textanalyse mit awk kennengelernt:
- Feldextraktion (
$N): Auf einzelne Datenspalten mit$1,$2usw. zuzugreifen. - Feldtrennzeichen (
-F): Dateien mit unterschiedlichen Trennzeichen, etwa Doppelpunkten oder Kommas, mithilfe der Option-Fzu verarbeiten. - Das letzte Feld (
$NF): Dynamisch auf die letzte Spalte eines Datensatzes zuzugreifen.
Mit diesen Techniken können Sie unstrukturierten strukturierten Text in saubere, nutzbare Datenströme für die weitere Verarbeitung umwandeln.



