Benutzer-Werkzeuge

Webseiten-Werkzeuge


awk

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
awk [2017/09/08 22:59]
root [Relational Expression]
awk [2017/10/19 21:33] (aktuell)
root [Built-In]
Zeile 39: Zeile 39:
       * diese Funktionen werden also nicht für jede Zeile ausgeführt       * diese Funktionen werden also nicht für jede Zeile ausgeführt
       * können beliebige Aktionen/Code enthalten, die nur vor dem Einlesen der ersten Zeile und nach dem alle Zeilen eingelesen wurden, ausgeführt werden       * können beliebige Aktionen/Code enthalten, die nur vor dem Einlesen der ersten Zeile und nach dem alle Zeilen eingelesen wurden, ausgeführt werden
-\\ \\+\\ 
   * alle anderen Funkionen werden immer ausgeführt - für jede Zeile die eingelesen wird   * 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.   * 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       * Pattern sind optional, Actions ohne Pattern davor werden immer ausgeführt
 +\\
 +  * Ein Action-Block kann aus mehreren Aktionen/Befehlen bestehen 
 +      * das einleitende { muss direkt (in der gleichen Zeile) wie das Pattern stehen
 +      * einzelne Aktionen werden durch ";" getrennt
 +
  
 ====== Pattern/Bedingungen ======  ====== Pattern/Bedingungen ====== 
Zeile 103: Zeile 108:
 Es gibt 3 Arten von Variablen. Es gibt 3 Arten von Variablen.
  
-**Fields**+===== Fields =====
  
   * enthalten den Inhalt von Feldern   * enthalten den Inhalt von Feldern
Zeile 110: Zeile 115:
     * $0 enthält den gesamten Record/Zeile     * $0 enthält den gesamten Record/Zeile
  
-**Built-In** +===== Built-In =====  
-  * Variablen deren Inhalt das Verhalten von awk bestimmen oder die Statusinformationen enthalten+  * Variablen deren Inhalt das Verhalten von awk bestimmen oder die Sjantatusinformationen enthalten
       * haben normale Namen (ohne irgend etwas davor)       * haben normale Namen (ohne irgend etwas davor)
  
Zeile 117: Zeile 122:
  
 ^Name ^Beschreibung ^ ^Name ^Beschreibung ^
-|FS|Field Separator - Definiert das Trennzeichen bzw. den Regular Expression zum Trennen der Fields/Felder.| +|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<WRAP> 
-|RS|Record Separator - Definiert das Trennzeichen bzw. den Regular Expression zum Trennen der Records/Zeilen| +<code> 
-|OFS|Output Field Seperator - Definiert das Trennzeichen +Eingabestring: Hallo-du-Mensch 
 +awk-Aufruf: awk 'BEGIN{FS="-"}{print $2}' 
 +Ausgabe: du 
 +</code> 
 +In obigem Beispiel ist der Field—Seperator (FS=) auf "-" gesetzt. \\ 
 +Aus dem String "Hallo-du-Mensch" werden also im awk-Script die Felder "Hallo" "du" "Mensch" - die über $1, $2 und $3 angesprochen werden können.  \\ \\ 
 +Der Field-Seperator kann beim Aufruf gesetzt werden über die Option -F: 
 +<code> 
 +awk -F "-" '{Code}' 
 +</code> 
 +oder in der BEGIN-Funktion: 
 +<code> 
 +awk '{BEGIN FS="-"
 +</code> 
 +\\ \\ 
 +Field-Seperator kann ein einzelnes Zeichen, eine Zeichenkette oder ein regular Expression sein (was mehrer Zeichen/Zeichenketten als Feldtrenner ermöglicht). 
 +\\ 
 +<code> 
 +FS="-" 
 +</code> 
 +In diesem Fall ist der Feldtrenner das Zeichen "-"
 +\\ \\ \\ 
 +<code> 
 +FS=");" 
 +</code> 
 +In diesem Fall ist die Zeichenkette ");" der Feldtrenner. \\ 
 +Beispielweise würde: 
 +<code> 
 +511);622, 633 
 +</code> 
 +in die Felder: "511" und "622, 633" zerlegt werden. \\ 
 +Aber: 
 +<code> 
 +511;622, 633 
 +</code> 
 +würden nicht zerlegt werden.\\ \\ 
 +Es muss immer die gesamte Zeichenkette zu finden sein die als Feldtrenner angegeben wurde. \\ \\ \\ 
 +<code> 
 +FS="-[0-9]{1,2}" 
 +</code> 
 +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. \\ 
 +Das bedeutet: 
 + 
 +  * "abc-def" würde nicht zerlegt, weil "-" alleine kein gültiger Feldtrenner ist 
 +  * "abc-1def" würde zerlegt in die Felder "abc" und "def" -> auf "-1" passt der reguläre Ausdruck im Feldtrenner 
 +  * "abc-19def" würde zerlegt in die Felder "abc" und "def" -> auf "-1" passt der reguläre Ausdruck im Feldtrenner 
 +\\ \\ 
 +<code> 
 +-F "-|:" 
 +</code> 
 +In diesem Fall ist entweder "-" oder ":" der Feldtrenner. 
 +\\  
 +Das bedeutet: 
 +  * "abc:def" -> würde zerlegt in "abc" und "def" 
 +  * "abc-def" -> würde zerlegt in "abc" und "def" 
 +  * "abc:-def" -> würde zerlegt in "abc", "" und "def" - das "" kommt daher, da zwischen dem Feldtrenner ":" und "-" keine Zeichen sind, es ensteht ein leeres Feld 
 + 
 +</WRAP>
 +|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. \\ \\ <WRAP> 
 +<code> 
 +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 
 +</code> 
 +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. \\ 
 +<code> 
 +Eingabestring: Dies ist ein Satz. Dies ist der nächste. Dies der danach. 
 +Script: awk 'BEGIN{RS="."} {print $2}' 
 +Ausgabe:  
 +ist 
 +ist 
 +der 
 +</code> 
 +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. \\ \\ 
 +Im Prinziep trifft alles (die definierbaren regular Expressions usw.) vom Field Seperator auch auf den Recordseperator zu. 
 +</WRAP>
 +|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. <WRAP> |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. <WRAP>
 <code> <code>
awk.1504904380.txt.gz · Zuletzt geändert: 2017/09/08 22:59 von root