awk ist Zeilenorientiert - alle Anweisungen (außer Begin und End) auf die aktuell eingelesene Zeile angewendet. Anschließend wird die nächste Zeile eingelesen und das gleiche wiederholt.
Jede Zeile (Record) wird in Felder (Fields) zerlegt, auf die über Variablen $1 bis $x zugegriffen werden kann.
Die Zeichen anhand der das Ende eines Rekord (Zeile) erkannt wird kann frei definiert werden, gleiches gilt das Zeichen anhand dessen die einzelnen Fields (Felder) separiert werden - Default: New Line-Character bzw. Space.
Syntax:
BEGIN { Code; } /PATTERN/{ Code; } END{ Code; }
Es gibt mehrere Bedingungen bzw. Gestaltungsmöglichkeiten dieser.
Syntax:
/Regular Expression/{ some Code }
Beispiel:
/192.168.20.[0-9]/{ some Code }
Beispiel matcht wenn die IP mit 192.168.20 beginnt und auf 0-9 endet.
192.168.20.9“ heißt.
Sind komplexere Bedingungen bei denen gegen Feld-Variablen oder andere Variablen geprüft werden kann.
Mehrere Bedingungen können verknüpft werden.
Syntax:
Variable Vergleichsoperator Ausdruck{ Code } <code> \\ \\
Es gibt 3 Arten von Variablen.
Einige Variablen:
Name | Beschreibung |
---|---|
FS | Field Separator - Definiert das/die Trennzeichen bzw. den Regular Expression zum Trennen der Fields/Felder. Eine Eingabezeile wird an den Stellen wo der Field Seperator in der Zeile gefunden wird in einzelne Felder zerlegt, auf die anschließend per $1-$x zugegriffen werden kann. Der Field Seperator wird dabei entfernt Eingabestring: Hallo-du-Mensch awk-Aufruf: awk 'BEGIN{FS="-"}{print $2}' Ausgabe: du
In obigem Beispiel ist der Field—Seperator (FS=) auf „-“ gesetzt. awk -F "-" '{Code}' oder in der BEGIN-Funktion: awk '{BEGIN FS="-"}
FS="-"
In diesem Fall ist der Feldtrenner das Zeichen „-“.
FS=");"
In diesem Fall ist die Zeichenkette „);“ der Feldtrenner. 511);622, 633
in die Felder: „511“ und „622, 633“ zerlegt werden. 511;622, 633
würden nicht zerlegt werden. FS="-[0-9]{1,2}"
In diesem Fall ist der Feldtrenner das Zeichen „-“ + eine Zahl im Bereich 0-9 die mindestens einmal aufauchen muss, maximal 2 mal auftauchen darf - es handelt sich hier um einen regulären Ausdruck.
-F "-|:"
In diesem Fall ist entweder „-“ oder „:“ der Feldtrenner.
|
RS | Record Separator - Definiert das Trennzeichen bzw. den Regular Expression zum Trennen der Records/Zeilen. awk ließt einen Zeichenstrom (zum Beispiel eine Datei) sequentiell bis es auf den RS (Record Separator) stößt ein. Wird der RS gefunden, wird alles bisher (bzw. zwischen dem aktuellen RS und dem davor) in der Variable $0 gespeichert, anschließend wird die Zeichenkette anhand des FS in Felder zerlegt und das awk-Script auf den Record/Zeile in $0 angewendet. Der RS ist bei Default Newline (\n), womit bei default eine Zeile in einem Texteditor einem Record in awk entspricht. Eingabestring: Dies ist ein Satz. Dies ist der nächste. Dies der danach. Script: awk 'BEGIN{RS="."} {print $0}' Ausgabe: Dies ist ein Satz Dies ist der nächste Dies der danach
In obigem Beispiel enthält $0 den aktuellen Record, da „.“ der Recordseperator ist, landed immer ein Satz in $0, danach wird das awk-Script für den aktuellen Record (in diesem Fall also für je einen Satz) ausgeführt → in diesem Fall die Ausgabe des aktuellen Satzes. Eingabestring: Dies ist ein Satz. Dies ist der nächste. Dies der danach. Script: awk 'BEGIN{RS="."} {print $2}' Ausgabe: ist ist der
Obiges Beispiel ließt je einen Satz ein (da ein Record jeweils durch „.“ getrennt wird) und gibt das 2 Feld in jedem der eingelesenen Records aus. |
OFS | Output Field Seperator - Definiert das Trennzeichen |
ORS | Output Record Seperator - Definiert wie Records bei der Ausgabe getrennt werden. Per Default durch New Line (\n). Bei der Ausgabe ist ein Record ein print-Statement und alles was dies ausgibt. Gibt es mehrere Ausgaben durch print, startet jedes print-Statement einen neue Zeile/Record - auch wenn sie das Ergebnis der gleichen Eingabezeile/Eingaberecord sind. ps axu | awk 'BEGIN{ORS="; "}{print $2, $11; print "zweite ausgabe"}'
1 /sbin/init; zweite ausgabe; 2 [kthreadd]; zweite ausgabe;
|
* match-Funktionen ergeben auch true wenn nur ein Teilstring gematcht wird
Syntax:
BEGIN { Code; } /PATTERN/{ Code; } END{ Code; }