Awk
Achtung dieser Artikel ist noch in Arbeit und dient vorläufig nur als Vorlage. Dieser Beitrag zu Linux oder der Abschnitt ist in Bearbeitung. Weitere Informationen findest du hier. Der Ersteller arbeitet an dem Beitrag oder Abschnitt und entsorgt den Wartungsbaustein spätestens 3 Tage nach der letzten Bearbeitung. Änderungen außer Rechtschreibkorrekturen ohne Absprache mit dem Urspungsautor sind möglichst zu vermeiden, solange dieser Baustein noch innerhalb der genannten Frist aktiviert ist. |
Robi 18:38, 26. Sep. 2008 (UTC)
Hier wird in nächster Zeit eine kleine Einführung in awk enstehen. Wegen der Mächtigkeit und des Gesamtumfanges wird auf eine tiefgründige Aufarbeitung des Themas verzichtet, Im Wesentlichen ist folgende Struktur geplant.
Inhaltsverzeichnis
Was ist awk und was kann awk ?
Awk ist eine tratitionelle Script-Programmiersprache und auf jedem UNIX- und Linux-System zu finden. Der Interpreter ist ein Programm namens awk ( benannt nach den geistigen Urvätern Alfred v. Aho ; Peter J. Weinberger und Brian W. Kernighan ). Das gesamte Konzept ist für eine Batchverarbeitung ausgelegt, d.h ein awk Programm wird ohne äußeren Eingriff eines Benutzers von Anfang bis zum Ende ausgeführt. Häuptsächlich wird es zum Durchsuchen, Auswerten und Manipulieren von Daten eingesetzt.
Das Grundprinzip von awk beruht auf der Verarbeitung einer Datei oder der Standardeingabe, dieser wird zeilenweise nach anwenderspezifischen Mustern durchsucht und beim Auffinden von Übereinstimmung eine dem jeweiligem Muster zugeordnete Aktion ausgeführt. Das Ergebnis wird in der Standardausgabe ausgegeben oder kann entsprechend umgeleitet werden. Sowohl Ein- wie auch Ausgabe wird dabei von awk als eine Folge von durch Zeilentrennzeichen separierte Zeilen (records) angesehen, die ihrerseits wieder durch Feldtrennzeichen in einzelne Felder aufgeteilt sind. Sowohl Zeilentrennzeichen (default ASCII-LF) als auch Feldtrennzeichen ( default Leerzeichen oder Tabulatorzeichen) können vom Anwender auch individuell angepasst werden. Eine Eingabezeile kann als Ganzes mit dem Bezeichner $0 angesprochen werden, die einzelnen Felder der Zeile mit $1 , $2 , $3 .... $n. Besonders geeignet sind somit Dateien in Listen- oder Tabellenform oder analog die Ausgaben von Befehlen in diesem Format, und davon gibt es auf jedem Rechner jede Menge.
Die Spachelemente von awk ist dem der Programmiersprache C nicht unähnlich. Die Möglichkeit von Konstanten und Variablen (auch als Feld und Array Elemente) die integierte Typenanpassung, die Steuerelementen zB in Form von Schleifen und Verzweigungen und schon eingebauten Funktionen der Formatierung der Textmanipulation und einiger häufiger mathematischer Funktionen machen awk zu einem sehr mächtigem Tool. Mit seiner Hilfe lassen sich auf einfache Weise eine Vielzahl von Problemen lösen, für die es sonst wenig andere akzeptable Lösungsmöglichkeiten im Scriptumfeld gibt. Allerdings sollte man bedenken, awk ist eine interpretierende Sprache und desshalb insbesondere bei der Bearbeitung großer Datenbestände in Punkto Geschwindigkeit gegenüber anderen kompilierbaren Sprachen und Tools im Nachteil.
Kleine awk Lösungen lassen sich auf der Kommandozeile bequem mittels Pipe mit anderen Kommandos verbinden und so sowohl auf der Kommandozeile wie auch in Shellscripten sehr universell direkt benutzen. akw wird heute zB in der Systemverwaltung innerhalb von Scripten verwendet für die Bearbeitung von Konfigurationsdateien sowie für einmaliges oder gelegentliches komplexes Filtern, Konvertieren und Auswerten von umfangreichen Daten zB von Logdateien. Unterteilen kann man die Einsatzgebiete in 3 Gruppen.
- Datenauswertung und -aufbereitung
Vor allem bei Anwendungen mit Listenausgabe, dabei sind uA. Filteroptionen und statistische Problemstellungen, wie z.B. Berechnung oder einfach nur Summierung von Feldinhalten oder Zählung von Häufigkeiten, in Verbindung mit weiteren Auswahlkriterien möglich
- Datentransformation
Eingabedaten werden auf beliebige Weise neu gruppiert, neu formatiert oder selektiv verändert.
- Datenvalidierung
Überprüfung der Daten auf ihre syntaktische und semantische Korrektheit. Auch komplettes Neuerstellen von Konfigurationsdateien aus vom User editierten Dateien.
Der grundlegende Befehlsaufruf
Für das Ausführens eines awk Programmes benötigen wir also einerseits den Interpreter, das ist das Programm namens awk selbst, weiterhin benötigen wir in den meisten Fällen die Datei oder den Datenstrom der bearbeitet werden soll und wir benötigen noch den awk Programmtext. Prinzipell ist es möglich diesen Programmtext entweder in eine separate Datei abzulegen und von dort aus darauf beim Programmaufruf zuzugreifen oder aber der Programmtext kann auch direkt auf der Komandozeile hinter dem Interpreteraufruf stehen.
awk -f Programmdatei Eingabedatei
- Programmtext als separate Datei
Dieser Aufruf wird meist bei umfangreichen oder universellen awk Programmen bevorzugt. Der Programmtext kann hierzu seperat in einer Datei entwickelt werden, und muss nicht immer wieder neu auf der Komandozeile erstellt werden.
awk 'Programmtext' Eingabedatei
- Programmtext vor Interpretation durch die Shell geschütz direkt hinter den Programmaufruf
Diese Form ist besonders für klein und kleinste awk Programme geeignet, da im Falle eines Syntaxfehlers der gesamte awk Programmtext in der Komandozeile wieder neu eingegeben werden muss, und man oftmals auf hilfreiche übersichtliche Formatierung des awk Programmtextes verzichten muss.
Beide Aufrufmöglichkeiten lassen sich in Shellscripten verwenden. Wobei oftmals innerhalb von Shellscripten die 2. Variante bevorzugt wird, da damit das awk Programm mit dem Shellscipt gleichzeitig entwickelt werden kann und dann auch beides als eine Einheit in einer einzigen Datei enthalten ist. Bei universalen awk Programmtexten, die von mehreren Scripten aufgerufen werden können, bietet sich jedoch die erste Variante besser an.
Die Programmstruktur
Ein awk Programm besteht aus einer Folge von Bedingungen und Aktionen die dieser Bedingung zugeordnet sind und hat folgende allgemeine Struktur
BEGIN { Aktion... } Bedingung_1 { Aktion... } Bedingung_2 { Aktion... } .... Bedingung_n { Aktion... } END { Aktion... }
- BEGIN und END sind Schlüsselworte für spezielle Bedingungen innerhalb des Programmablauf, deren Aktionen werden entweder vor oder nach der Bearbeitung der Datei ausgeführt. BEGIN oder END Aktionen sind optional, also nicht jedes awk Programm muss sie beinhalten.
- Um die Bedingungen von den Aktionen unterscheiden zu können, werden die Aktionen in geschweifte Klammern { } eingeschlossen. Mehrere Aktionen können durch ; oder durch einen Zeilentrennzeichen getrennt werden.
- Bedingungungen dürfen nicht über mehrere Zeilen geschrieben werden.
- ein Aktion müssen in derselben Programmzeile beginnen in der die Bedingung steht ( "{" reicht aus ) dürfen aber über mehrere Zeilen fortgesetzt werden.
- bei einer fehlenden Bedingung, wird die Aktion für jede Zeile der Eingabedatei ausgeführt.
- bei einer fehlenden Aktion, wird jede zur Bedingung passenden Zeile unverändert an die Ausgabe durchgereicht.
Der Programmablauf
- Ist eine BEGIN Bedingung im Programm enthalten wird zuerst diese Aktion ausgeführt
- hier ist es zB möglich spezielle Bedingungn (zB: Feldtrennzeichen für Ein- oder Ausgabe ) für den weiteren Programmablauf festzulegen, Variablen vorzubelegen oder Ausgaben zu machen, die dann in vor den verarbeiteten Daten in der Ausgabe erscheinen
- Der eigentliche Hauptprogrammablauf erfolgt in einer Doppelschleife
- dabei wird jeweils eine einzelne Zeile der Reihe nach auf alle programmierten Bedingungen geprüft und gegebenenfalls die dazugehörige Aktion ausgeführt. Sind alle Bedingungen für die erste Zeile abgearbeitet, wird die nächste Zeile geladen und diese wiederum auf alle Bedingungen geprüft, bis auch die letzte Zeile so abgearbeitet ist.
- Ist eine END Bedingung enthalten, wird nach dem Durchlauf aller Zeilen die Aktion zur END Bedingung ausgeführt
- Hier können jetzt die Variablen nach dem Programmdurchlauf verarbeitet und ausgegeben werden, oder Ausgaben erfolgen, die unterhalb der verarbeiteten Daten angehängt werden.
Die Bedingungen
Wie oben schon beschrieben, legt eine Bedingung fest, ob für eine Zeile die dazugehörige Aktion auszuführen ist oder nicht. In awk gibt es 2 prinzipielle Möglichkeiten für Bedingungen, einmal Reguläre Ausdrücke und zum anderem Vergleichsausdrücke. Reguläre Ausdrücke müssen in Schrägstriche /..../ eingeschlossen werden. Dabei kann sowohl auf den Inhalt der ganzen Zeile sowie auf deren einzelnen Felder wie auch auf die Variablen innerhalb des Programmes zugegriffen werden. Darüber hinaus ist es möglich mit logischen Verknüpfungen und Bereichen (analog etwa von - bis) zu arbeiten. Die Leistungsfähigkeit und Möglichkeiten von awk gehen hier weit über das hinaus, was andere Scriptsprachen, Tools und Programme können. An dieser Stelle nur ein paar Beispiele.
Die Aktion
Mit der Aktion werden im Wesentlichen 2 Dinge getätigt, zum einem werden hier die Ausgaben erstellt, und zum anderen können hier die Variablen während des Programmablaufs geändert also zB abhängig von Werten innerhalb der Zeile neu berechnet werden. Eine Aktion kann ihrerseits wieder mit Hilfe von Bedingungen oder Schleifen gesteuert werden. Die Ausgabe ist die wesentliche Aufgabe der Aktionen, denn ohne eine einzige Ausgabe würde unser awk Programm ja gar nichts machen. Die einfachste Form der Ausgabe ist die Funktion print darüber hinaus sind aber weitere sehr leistungsfähige Printfunktionen analog der Programmiersprache C vorhanden. An dieser Stelle nur einige Beispiele
Einige einfache Beispiele mit Erläuterungen
weiterführende Links
- deutschsprachige Einführung in awk
- AWK Reportgenerator Guide gute deutsche Schnellübersicht
- The GNU Awk User's Guide
- awk Manpage
- The AWK Programming Language das orginal Buch sollte wohl mittlerweile auch deutsch erhältlich sein
- ein unvollendetes [ http://de.wikibooks.org/wiki/Awk awk Wikibook]