Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
awk [2014/09/07 18:23] 127.0.0.1 Externe Bearbeitung |
awk [2017/10/19 21:33] (aktuell) root [Built-In] |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | | + | ====== Konzept ====== |
+ | |||
+ | 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. | ||
+ | |||
+ | * Zeilenorientiert | ||
+ | * eine Zeile = ein Record | ||
+ | * Das Zeichen welches einen Record beendet ist frei definierbar | ||
+ | * per Default: New Line-Zeichen | ||
+ | * Auftrennung des Records in Fields (Felder) | ||
+ | * auf die einzelnen Felder kann über Variablen zugegriffen werden | ||
+ | * das Zeichen zum Auftrennen in Felder kann frei definiert werden | ||
+ | * per Default ist es ein Leerzeichen | ||
+ | |||
+ | |||
+ | ====== Aufbau ====== | ||
+ | |||
+ | Syntax: | ||
+ | |||
+ | < | ||
+ | BEGIN { | ||
+ | | ||
+ | } | ||
+ | |||
+ | |||
+ | / | ||
+ | Code; | ||
+ | } | ||
+ | |||
+ | |||
+ | END{ | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | * BEGIN und END sind optional und werden jeweils am Anfang und Ende des gesamten Scriptes ausgeführt | ||
+ | * diese Funktionen werden also nicht für jede Zeile ausgeführt | ||
+ | * können beliebige Aktionen/ | ||
+ | \\ | ||
+ | * alle anderen Funkionen werden immer ausgeführt - für jede Zeile die eingelesen wird | ||
+ | * die /Pattern/ sind Bedingungen die gegeben sein müssen, damit die Action (der darauffolgende Code Block) ausgeführt wird - so wie if-Anweisungen. | ||
+ | * Pattern sind optional, Actions ohne Pattern davor werden immer ausgeführt | ||
+ | \\ | ||
+ | * Ein Action-Block kann aus mehreren Aktionen/ | ||
+ | * das einleitende { muss direkt (in der gleichen Zeile) wie das Pattern stehen | ||
+ | * einzelne Aktionen werden durch ";" | ||
+ | |||
+ | |||
+ | ====== Pattern/ | ||
+ | |||
+ | Es gibt mehrere Bedingungen bzw. Gestaltungsmöglichkeiten dieser. | ||
+ | |||
+ | |||
+ | ===== BEGIN/END ===== | ||
+ | |||
+ | * der Code-Block wird am Anfang des Scripts bzw. am Ende der Ausführung des Scripts ausgeführt | ||
+ | |||
+ | ===== BEGINFILE/ | ||
+ | |||
+ | * Der Code-Block wird am Anfang oder Ende einer jeden Eingabedatei ausgeführt | ||
+ | * Man kann awk mehrere Dateien als Argument übergeben | ||
+ | |||
+ | ===== Regular Expression ===== | ||
+ | |||
+ | Syntax: | ||
+ | |||
+ | < | ||
+ | /Regular Expression/ | ||
+ | some Code | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | \\ | ||
+ | Beispiel: | ||
+ | < | ||
+ | / | ||
+ | some Code | ||
+ | } | ||
+ | </ | ||
+ | \\ | ||
+ | Beispiel matcht wenn die IP mit 192.168.20 beginnt und auf 0-9 endet. | ||
+ | \\ \\ | ||
+ | * Supported werden extended Regular Expressions (siehe man Page) | ||
+ | * Regular-Expressions müssen immer innerhalb von / / stehen (auch wenn sie mit anderen Anweisungen kombiniert werden) | ||
+ | * der Code-Block wird ausgeführt wenn der Regular Expression auf die aktuelle Zeile zutrifft | ||
+ | * **Achtung** es reicht wenn der Regular-Expression irgendwo auf der Zeile zutrifft. Es muss nicht die ganze Zeile zutreffen -> 192.168.20.[0-9] würde auch matchen wenn die Zeile: "Dies ist die IP-Adresse: | ||
+ | 192.168.20.9" | ||
+ | |||
+ | |||
+ | ===== Relational Expression ===== | ||
+ | |||
+ | 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 | ||
+ | } | ||
+ | < | ||
+ | \\ \\ | ||
+ | </ | ||
+ | |||
+ | ====== Variablen ====== | ||
+ | |||
+ | Es gibt 3 Arten von Variablen. | ||
+ | |||
+ | ===== Fields ===== | ||
+ | |||
+ | * enthalten den Inhalt von Feldern | ||
+ | * werden als $1-$x angesprochen (die Felder sind durchnummeriert) | ||
+ | * die Benamung ist auch beim Ändern/ | ||
+ | * $0 enthält den gesamten Record/ | ||
+ | |||
+ | ===== Built-In ===== | ||
+ | * Variablen deren Inhalt das Verhalten von awk bestimmen oder die Sjantatusinformationen enthalten | ||
+ | * haben normale Namen (ohne irgend etwas davor) | ||
+ | |||
+ | Einige Variablen: | ||
+ | |||
+ | ^Name ^Beschreibung ^ | ||
+ | |FS|Field Separator - Definiert das/die Trennzeichen bzw. den Regular Expression zum Trennen der Fields/ | ||
+ | < | ||
+ | Eingabestring: | ||
+ | awk-Aufruf: awk ' | ||
+ | Ausgabe: du | ||
+ | </ | ||
+ | In obigem Beispiel ist der Field—Seperator (FS=) auf " | ||
+ | Aus dem String " | ||
+ | Der Field-Seperator kann beim Aufruf gesetzt werden über die Option -F: | ||
+ | < | ||
+ | awk -F " | ||
+ | </ | ||
+ | oder in der BEGIN-Funktion: | ||
+ | < | ||
+ | awk ' | ||
+ | </ | ||
+ | \\ \\ | ||
+ | Field-Seperator kann ein einzelnes Zeichen, eine Zeichenkette oder ein regular Expression sein (was mehrer Zeichen/ | ||
+ | \\ | ||
+ | < | ||
+ | FS=" | ||
+ | </ | ||
+ | In diesem Fall ist der Feldtrenner das Zeichen " | ||
+ | \\ \\ \\ | ||
+ | < | ||
+ | FS=" | ||
+ | </ | ||
+ | In diesem Fall ist die Zeichenkette " | ||
+ | Beispielweise würde: | ||
+ | < | ||
+ | 511);622, 633 | ||
+ | </ | ||
+ | in die Felder: " | ||
+ | Aber: | ||
+ | < | ||
+ | 511;622, 633 | ||
+ | </ | ||
+ | würden nicht zerlegt werden.\\ \\ | ||
+ | Es muss immer die gesamte Zeichenkette zu finden sein die als Feldtrenner angegeben wurde. \\ \\ \\ | ||
+ | < | ||
+ | FS=" | ||
+ | </ | ||
+ | In diesem Fall ist der Feldtrenner das Zeichen " | ||
+ | Das bedeutet: | ||
+ | |||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | \\ \\ | ||
+ | < | ||
+ | -F " | ||
+ | </ | ||
+ | In diesem Fall ist entweder " | ||
+ | \\ | ||
+ | Das bedeutet: | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | |||
+ | </ | ||
+ | |RS|Record Separator - Definiert das Trennzeichen bzw. den Regular Expression zum Trennen der Records/ | ||
+ | < | ||
+ | Eingabestring: | ||
+ | Script: awk ' | ||
+ | Ausgabe: | ||
+ | Dies ist ein Satz | ||
+ | Dies ist der nächste | ||
+ | Dies der danach | ||
+ | </ | ||
+ | In obigem Beispiel enthält $0 den aktuellen Record, da " | ||
+ | < | ||
+ | Eingabestring: | ||
+ | Script: awk ' | ||
+ | Ausgabe: | ||
+ | ist | ||
+ | ist | ||
+ | der | ||
+ | </ | ||
+ | Obiges Beispiel ließt je einen Satz ein (da ein Record jeweils durch " | ||
+ | Im Prinziep trifft alles (die definierbaren regular Expressions usw.) vom Field Seperator auch auf den Recordseperator zu. | ||
+ | </ | ||
+ | |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/ | ||
+ | < | ||
+ | ps axu | awk ' | ||
+ | </ | ||
+ | \\ \\ | ||
+ | Die Ausgabe: | ||
+ | \\ | ||
+ | < | ||
+ | 1 /sbin/init; zweite ausgabe; 2 [kthreadd]; zweite ausgabe; | ||
+ | </ | ||
+ | \\ \\ | ||
+ | 1 und /sbin/init und sind der Inhalt von $1 und $11 des ersten print statements. \\ | ||
+ | " | ||
+ | Da jedes print-Statement einen eigenen Record erzeugt, sind "1 / | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | * match-Funktionen ergeben auch true wenn nur ein Teilstring gematcht wird | ||
* Reguläre Ausdrücke müssen nicht so konstruiert werden das sie den gesamten String erfassen, sondern es reicht wenn sie auf einen zusammenhängenden Teilstring passen | * Reguläre Ausdrücke müssen nicht so konstruiert werden das sie den gesamten String erfassen, sondern es reicht wenn sie auf einen zusammenhängenden Teilstring passen | ||
* FS -> Field-Seperator kann nur in BEGIN definiert werden | * FS -> Field-Seperator kann nur in BEGIN definiert werden |