So verwenden Sie den awk-Befehl unter Linux

Unter Linux erweist sich `awk` als ein vielseitiges Werkzeug zur Textbearbeitung in der Kommandozeile und gleichzeitig als eine ausdrucksstarke Skriptsprache. Dieser Artikel führt in einige der bemerkenswertesten Fähigkeiten von `awk` ein.

Die Namensgebung von awk

Der Name des Befehls `awk` ist ein Akronym, gebildet aus den Initialen der drei Personen, die 1977 die ursprüngliche Version entwickelten: Alfred Aho, Peter Weinberger und Brian Kernighan. Diese drei Pioniere stammen aus dem renommierten AT&T Bell Laboratories Unix-Entwicklungsumfeld. Im Laufe der Zeit wurde `awk` durch die Beiträge zahlreicher anderer Entwickler weiterentwickelt.

Es dient sowohl als vollständige Skriptsprache als auch als umfassendes Toolkit zur Textverarbeitung für die Kommandozeile. Wenn dieser Beitrag Ihr Interesse weckt, können Sie eine detaillierte Analyse von awk und seiner Funktionalität einsehen.

Regeln, Muster und Aktionen in awk

`awk` operiert mit Programmen, die Regeln beinhalten, welche sich aus Mustern und Aktionen zusammensetzen. Die jeweilige Aktion wird auf den Text angewendet, der mit dem Muster übereinstimmt. Muster werden in geschweifte Klammern ({}) eingeschlossen. Eine Kombination aus Muster und Aktion bildet eine Regel. Das gesamte `awk`-Programm wird in einfache Anführungszeichen (‚ ‚) gesetzt.

Betrachten wir das einfachste `awk`-Programm. Es beinhaltet kein Muster, somit passt es zu jeder Textzeile, die an es übergeben wird. Dies bedeutet, dass die Aktion für jede Zeile ausgeführt wird. Verwenden wir dies zur Interpretation der Ausgabe des `who`-Befehls.

Hier die Standardausgabe von `who`:

who

Nehmen wir an, wir sind nicht an allen Informationen interessiert, sondern möchten lediglich die Benutzernamen sehen. Wir können die Ausgabe von `who` an `awk` weiterleiten und `awk` anweisen, nur das erste Feld auszugeben.

Standardmäßig betrachtet `awk` ein Feld als eine Folge von Zeichen, die von Leerzeichen, dem Anfang einer Zeile oder dem Ende einer Zeile begrenzt werden. Felder werden durch ein Dollarzeichen ($) gefolgt von einer Zahl identifiziert. So repräsentiert $1 das erste Feld, das wir mittels der `print`-Aktion zur Ausgabe verwenden.

Wir geben folgendes ein:

who | awk '{print $1}'

`awk` gibt das erste Feld aus und ignoriert den Rest der Zeile.

Wir können beliebig viele Felder ausgeben. Wenn wir ein Komma als Trennzeichen hinzufügen, fügt `awk` ein Leerzeichen zwischen den ausgegebenen Feldern ein.

Um auch die Anmeldezeit des Benutzers (Feld vier) auszugeben, verwenden wir:

who | awk '{print $1,$4}'

Es gibt einige besondere Feldbezeichner, die die gesamte Textzeile sowie das letzte Feld in der Textzeile darstellen:

$0: Repräsentiert die komplette Textzeile.
$1: Repräsentiert das erste Feld.
$2: Repräsentiert das zweite Feld.
$7: Repräsentiert das siebte Feld.
$45: Repräsentiert das 45. Feld.
$NF: Steht für „Number of Fields“ und repräsentiert das letzte Feld.

Um eine kleine Textdatei anzuzeigen, die ein kurzes Zitat enthält, das Dennis Ritchie zugeschrieben wird, geben wir folgendes ein:

cat dennis_ritchie.txt

Wir möchten, dass `awk` das erste, zweite und letzte Feld des Zitats ausgibt. Beachten Sie, dass es, obwohl es im Terminalfenster umbrochen ist, als eine einzelne Textzeile behandelt wird.

Wir geben folgenden Befehl ein:

awk '{print $1,$2,$NF}' dennis_ritchie.txt

Wir kennen diese „Einfachheit“ nicht. Die Zahl, die wir gesehen haben, wäre hier das 18. Feld gewesen, aber das ist irrelevant. Wichtig ist, dass es das letzte Feld ist, und wir können $NF verwenden, um seinen Wert zu erhalten. Der Punkt wird lediglich als ein weiteres Zeichen in der Zeile behandelt.