Awk: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(48 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
=Grundlegendes=
 
=Grundlegendes=
awk ist eine Programmiersprache (Skriptsprache) zur Bearbeitung und Auswertung strukturierter Textdaten, beispielsweise CSV-Dateien. Der zugehörige Interpreter war eines der ersten Werkzeuge, das in der Version 3 von Unix erschien; es wird auch heute noch vielfach zusammen mit sed in Shell-Skripten eingesetzt, um Daten zu bearbeiten, umzuformen oder auszuwerten. Der Name "awk" ist aus den Anfangsbuchstaben der Nachnamen ihrer drei Autoren Alfred V. Aho, Peter J. Weinberger und Brian W. Kernighan zusammengesetzt.
+
*Programmiersprache zur Bearbeitung und Auswertung von Textdaten
 +
*Gibt es schon länger als Perl, Python usw
 +
*Wird in Shellskripten eingesetzt
 +
*AWK steht für drei Autoren Alfred V. Aho, Peter J. Weinberger und Brian W. Kernighan
 +
*Ist praktisch auf jedem Unix/Linux verfügbar
 +
*Arbeitet fast ausschließlich mit dem Datentyp Zeichenkette
  
Eine Version von awk ist heute in fast jedem Unix-System, das historisch auf UNIX zurückzuführen ist, sowie in jeder Linux-Distribution zu finden. Ein vergleichbares Programm ist aber auch für fast alle anderen Betriebssysteme verfügbar.
+
= Aufbau eines Programms =
 +
*Operationen – etwa Ersetzungen – auf einem Eingabetext durchzuführen.
 +
*Text wird zeilenweise eingelesen
 +
*Wird von Trenner in Felder aufgespalten
 +
*Anschließend werden Anweisungen Zeilen angewandt
  
Die Sprache arbeitet fast ausschließlich mit dem Datentyp Zeichenkette. Daneben sind assoziative Arrays (d. h. mit Zeichenketten indizierte Arrays, auch Hashs genannt) und reguläre Ausdrücke grundlegende Bestandteile der Sprache.
+
=awk-Anweisungen haben folgende Struktur=
== Aufbau eines Programms ==
+
<syntaxhighlight lang="awk">
Die typische Ausführung eines awk-Programms besteht darin, Operationen – etwa Ersetzungen – auf einem Eingabetext durchzuführen. Dafür wird der Text zeilenweise eingelesen und anhand eines gewählten Trenners – üblicherweise eine Serie von Leerzeichen und/oder [[Tabulatorzeichen]] – in Felder aufgespalten. Anschließend werden die awk-Anweisungen auf die jeweilige Zeile angewandt.  
+
  Bedingung { Anweisungsblock }
 +
</syntaxhighlight>
 +
*Zeilenweise wird gecheckt ob die Bedingung erfüllt ist
 +
*Wenn Ja wird der Anweisungsblocks ausgeführt
 +
*Es kann auch nur eine Aktion ausgeführt werden
 +
<syntaxhighlight lang="awk">
 +
  { Anweisungsblock }
 +
</syntaxhighlight>
 +
*Es kann auch nur aus einer Bedingung bestehen
 +
<syntaxhighlight lang="awk">
 +
  Bedingung
 +
</syntaxhighlight>
 +
 
 +
= Variablen und Funktionen =
 +
*Variablen werden bei der Belegung definiert
 +
*Gültigkeitsbereich ist in Regel global
 +
*Funktionen können an beliebiger Stelle definiert werden
 +
*Deklaration muss dabei nicht vor der ersten Nutzung erfolgen.
 +
*Bei Skalaren_Variablen, werden Funktionsargumente als Wertparameter übergeben
 +
*Sonst als Referenzparameter.
 +
*Argumente bei Aufruf einer Funktion müssen nicht der Funktionsdefinition entsprechen
 +
*überzählige Argumente werden als lokale Variablen behandelt
 +
*Funktionen und Variablen haben den gleichen Namensraums
 +
 
 +
;Neben benutzerdefinierten Variablen und Funktionen stehen auch Standardvariablen und Standardfunktionen zur Verfügung, *
 +
*$0 für die gesamte Zeile
 +
*$1, $2 , … für das jeweils i-te Feld der Zeile
 +
*FS für den Feldtrenner,
 +
*Die Funktionen gsub(), split() und match().
 +
*NR  laufende Nummer des aktuellen Satzes im Eingabestrom
 +
*NF Anzahl der Felder im aktuellen Satz
 +
*RS  Satz-/Zeilentrennzeichen, default:
 +
*ORS output record separator
 +
*FS Feldtrennzeichen, default: Leerzeichen und Tab
 +
*OFS Feldtrennzeichen für die Ausgabe, default: Leerzeichen
 +
 
 +
=Optionen=
 +
==Feldtrenner==
 +
*-F :
 +
=Vergleiche=
 +
==kleiner==
 +
*<<
 +
==grösser==
 +
*<<
 +
==gleich==
 +
*==
 +
 
 +
= Befehle =
 +
*Syntax ähnelt der Programmiersprache C
 +
*Elementare Befehle
 +
**sind Zuweisungen an Variablen
 +
**Vergleiche zwischen Variablen
 +
**Schleifen oder bedingte Befehlsausführungen
 +
**fest implementierte Funktionen
 +
**selbst programmierte Funktionen
 +
*Ausgaben auf der Standardausgabe durch den print-Befehl
 +
;Um etwa das zweite Feld einer Eingabezeile auszudrucken, wird der Befehl
 +
<syntaxhighlight lang="awk">
 +
  print $2
 +
</syntaxhighlight> benutzt.
  
awk-Anweisungen haben folgende Struktur:
+
= Bedingungen =
 +
Bedingungen sind in awk-Programmen entweder von der Form
 
<syntaxhighlight lang="awk">
 
<syntaxhighlight lang="awk">
  Bedingung { Anweisungsblock }
+
Ausdruck Vergleichsoperator Ausdruck
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Für die eingelesene Zeile wird ermittelt, ob sie die Bedingung (oft ein [[Regulärer Ausdruck]]) erfüllt. Ist die Bedingung erfüllt, wird der Code innerhalb des von geschweiften Klammern umschlossenen Anweisungsblocks ausgeführt.
+
oder von der Form
Abweichend davon
 
kann ein Statement auch nur aus einer Aktion
 
 
<syntaxhighlight lang="awk">
 
<syntaxhighlight lang="awk">
   { Anweisungsblock }
+
Ausdruck Matchoperator /reguläres Suchmuster/
 +
</syntaxhighlight>
 +
 
 +
*Reguläre Suchmuster wie bei grep
 +
*Matchoperator '''~''' für "Muster gefunden"
 +
*Matchoperator '''!~''' für "Muster nicht gefunden"
 +
*Abkürzung für die Bedingung
 +
**„$0 ~ /''reguläres Suchmuster''/“
 +
**„/''reguläres Suchmuster''/“
 +
*Spezielle Bedingungen gelten die Worte
 +
**''BEGIN'' wird vor der ersten Zeile ausgeführt
 +
**''END'' wird nach der letzten Zeile ausgeführt
 +
 
 +
Darüber hinaus können Bedingungen mit logischen Verknüpfungen zu neuen Bedingungen zusammengesetzt werden, z.&nbsp;B.
 +
<syntaxhighlight lang="awk">
 +
   $1 ~ /^E/ && $2 > 20 { print $3 }
 
</syntaxhighlight>
 
</syntaxhighlight>
  
oder nur aus einer Bedingung
+
Dieser AWK-Befehl bewirkt, dass von jeder Zeile, die mit ''E'' beginnt und deren zweites Feld eine Zahl größer 20 ist, das dritte Feld ausgegeben wird.
 +
 
 +
= While-Schleife =
 +
 
 +
* Der Aufbau und Syntax ähnelt der Programmiersprache C sehr
 +
* '''awk 'BEGIN {i = 0 ; while (i <= 5) { print i ; i++ }}' '''
 +
 
 +
1
 +
2
 +
3
 +
4
 +
5
 +
 
 +
= Beispiele =
 +
Einige einfache Programmbeispiele, die man z.&nbsp;B. unter Linux einfach in einer Shell eingeben kann:
 
<syntaxhighlight lang="awk">
 
<syntaxhighlight lang="awk">
  Bedingung
+
echo Hallo Welt | awk '{print $1}'
 +
echo Hallo Welt | awk '{print $2}'
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
=Test Datei=
 +
*cat partien.txt
 +
<pre>
 +
Muenchen - Nuernberg 2 : 1 68000 Zuschauer
 +
Union - Moenchengladbach 1 : 2 21000 Zuschauer
 +
Berlin -  Schalke 1 : 2 70000 Zuschauer
 +
Freiburg - Bremen 3 : 3 32000 Zuschauer
 +
Leverkusen - Dortmund 1 : 2 29000 Zuschauer
 +
Stuttgart - Mainz 3 : 1 50000 Zuschauer
 +
Leipzig - Koeln 1 : 3 45000 Zuschauer
 +
Frankfurt - Hoffenheim 2 : 1 40000 Zuschauer
 +
Duesseldorf - MSV 1 : 3 42000 Zuschauer
 +
</pre>
 +
 +
=Beispiele=
 +
;Wenn das 4. Feld grösser als das 6. ist, wird das 1. Feld ausgegeben.
 +
*awk '$4 > $6 { print $1 }' partien.txt
 +
;Feld 1, 7 und 8 werden mit Text dazwischen ausgegeben.
 +
*awk '{ print $1 " hatte ein Heimspiel mit  " $7 " " $8} ' partien.txt
 +
;Alle Zuschauer
 +
*awk '{ sum += $7 } END { print "Gesamtzahl der Zuschauer:", sum }' partien.txt
 +
;Erste Zeile wird nicht ausgegeben
 +
*awk 'NR>1 {  print $0 }'
 +
;IP in HEX umwandeln
 +
*echo 192.168.240.188  | awk ' BEGIN {FS="."} {  printf "%x:%x:%x:%x" , $1 ,$2, $3, $4 }'
 +
;IP in HEX umwandeln mit printf und xargs
 +
*echo 192.168.240.188  | awk -F .  ' {  print $1,$2,$3,$4 }'  | xargs -n 4 printf "%x:%x:%x:%x\n"
 +
;FELD1 und FELD2 getrennt durch ein -
 +
*awk  ' BEGIN { FS=":" ; OFS="-" }  $7 ~ /bash$/ {  print $1 , $3  }'  /etc/passwd
 +
;Alle User hintereinander
 +
*awk 'BEGIN {FS=":" ; ORS=" "} { print $1 }' /etc/passwd
 +
;Wer hat die bash als Shell
 +
*awk -F : '  $7 ~ /bash$/ {  print $1  }'  /etc/passwd
 +
 +
=Aufgaben=
 +
*[[Aufgaben awk]]
 +
 +
=Links=
 +
*http://mikiwiki.org/wiki/Kategorie:awk
 +
*http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_015_000.htm#RxxKap01500004004FCF1F017172
 +
*https://de.wikipedia.org/wiki/Awk
 +
*https://www-user.tu-chemnitz.de/~hot/unix_linux_werkzeugkasten/awk.html
 +
*https://likegeeks.com/awk-command/

Aktuelle Version vom 8. Juni 2023, 10:55 Uhr

Grundlegendes

  • Programmiersprache zur Bearbeitung und Auswertung von Textdaten
  • Gibt es schon länger als Perl, Python usw
  • Wird in Shellskripten eingesetzt
  • AWK steht für drei Autoren Alfred V. Aho, Peter J. Weinberger und Brian W. Kernighan
  • Ist praktisch auf jedem Unix/Linux verfügbar
  • Arbeitet fast ausschließlich mit dem Datentyp Zeichenkette

Aufbau eines Programms

  • Operationen – etwa Ersetzungen – auf einem Eingabetext durchzuführen.
  • Text wird zeilenweise eingelesen
  • Wird von Trenner in Felder aufgespalten
  • Anschließend werden Anweisungen Zeilen angewandt

awk-Anweisungen haben folgende Struktur

  Bedingung { Anweisungsblock }
  • Zeilenweise wird gecheckt ob die Bedingung erfüllt ist
  • Wenn Ja wird der Anweisungsblocks ausgeführt
  • Es kann auch nur eine Aktion ausgeführt werden
  { Anweisungsblock }
  • Es kann auch nur aus einer Bedingung bestehen
  Bedingung

Variablen und Funktionen

  • Variablen werden bei der Belegung definiert
  • Gültigkeitsbereich ist in Regel global
  • Funktionen können an beliebiger Stelle definiert werden
  • Deklaration muss dabei nicht vor der ersten Nutzung erfolgen.
  • Bei Skalaren_Variablen, werden Funktionsargumente als Wertparameter übergeben
  • Sonst als Referenzparameter.
  • Argumente bei Aufruf einer Funktion müssen nicht der Funktionsdefinition entsprechen
  • überzählige Argumente werden als lokale Variablen behandelt
  • Funktionen und Variablen haben den gleichen Namensraums
Neben benutzerdefinierten Variablen und Funktionen stehen auch Standardvariablen und Standardfunktionen zur Verfügung, *
  • $0 für die gesamte Zeile
  • $1, $2 , … für das jeweils i-te Feld der Zeile
  • FS für den Feldtrenner,
  • Die Funktionen gsub(), split() und match().
  • NR laufende Nummer des aktuellen Satzes im Eingabestrom
  • NF Anzahl der Felder im aktuellen Satz
  • RS Satz-/Zeilentrennzeichen, default:
  • ORS output record separator
  • FS Feldtrennzeichen, default: Leerzeichen und Tab
  • OFS Feldtrennzeichen für die Ausgabe, default: Leerzeichen

Optionen

Feldtrenner

  • -F :

Vergleiche

kleiner

  • <<

grösser

  • <<

gleich

  • ==

Befehle

  • Syntax ähnelt der Programmiersprache C
  • Elementare Befehle
    • sind Zuweisungen an Variablen
    • Vergleiche zwischen Variablen
    • Schleifen oder bedingte Befehlsausführungen
    • fest implementierte Funktionen
    • selbst programmierte Funktionen
  • Ausgaben auf der Standardausgabe durch den print-Befehl
Um etwa das zweite Feld einer Eingabezeile auszudrucken, wird der Befehl
  print $2

benutzt.

Bedingungen

Bedingungen sind in awk-Programmen entweder von der Form

 Ausdruck Vergleichsoperator Ausdruck

oder von der Form

 Ausdruck Matchoperator /reguläres Suchmuster/
  • Reguläre Suchmuster wie bei grep
  • Matchoperator ~ für "Muster gefunden"
  • Matchoperator !~ für "Muster nicht gefunden"
  • Abkürzung für die Bedingung
    • „$0 ~ /reguläres Suchmuster/“
    • „/reguläres Suchmuster/“
  • Spezielle Bedingungen gelten die Worte
    • BEGIN wird vor der ersten Zeile ausgeführt
    • END wird nach der letzten Zeile ausgeführt

Darüber hinaus können Bedingungen mit logischen Verknüpfungen zu neuen Bedingungen zusammengesetzt werden, z. B.

  $1 ~ /^E/ && $2 > 20 { print $3 }

Dieser AWK-Befehl bewirkt, dass von jeder Zeile, die mit E beginnt und deren zweites Feld eine Zahl größer 20 ist, das dritte Feld ausgegeben wird.

While-Schleife

  • Der Aufbau und Syntax ähnelt der Programmiersprache C sehr
  • awk 'BEGIN {i = 0 ; while (i <= 5) { print i ; i++ }}'
1
2
3
4
5

Beispiele

Einige einfache Programmbeispiele, die man z. B. unter Linux einfach in einer Shell eingeben kann:

echo Hallo Welt | awk '{print $1}'
echo Hallo Welt | awk '{print $2}'

Test Datei

  • cat partien.txt
Muenchen - Nuernberg			2 : 1		68000 Zuschauer			
Union - Moenchengladbach		1 : 2		21000 Zuschauer
Berlin -  Schalke			1 : 2		70000 Zuschauer
Freiburg - Bremen			3 : 3		32000 Zuschauer
Leverkusen - Dortmund			1 : 2		29000 Zuschauer	
Stuttgart - Mainz			3 : 1		50000 Zuschauer
Leipzig - Koeln				1 : 3		45000 Zuschauer
Frankfurt - Hoffenheim			2 : 1 		40000 Zuschauer
Duesseldorf - MSV 			1 : 3		42000 Zuschauer

Beispiele

Wenn das 4. Feld grösser als das 6. ist, wird das 1. Feld ausgegeben.
  • awk '$4 > $6 { print $1 }' partien.txt
Feld 1, 7 und 8 werden mit Text dazwischen ausgegeben.
  • awk '{ print $1 " hatte ein Heimspiel mit " $7 " " $8} ' partien.txt
Alle Zuschauer
  • awk '{ sum += $7 } END { print "Gesamtzahl der Zuschauer:", sum }' partien.txt
Erste Zeile wird nicht ausgegeben
  • awk 'NR>1 { print $0 }'
IP in HEX umwandeln
  • echo 192.168.240.188 | awk ' BEGIN {FS="."} { printf "%x:%x:%x:%x" , $1 ,$2, $3, $4 }'
IP in HEX umwandeln mit printf und xargs
  • echo 192.168.240.188 | awk -F . ' { print $1,$2,$3,$4 }' | xargs -n 4 printf "%x:%x:%x:%x\n"
FELD1 und FELD2 getrennt durch ein -
  • awk ' BEGIN { FS=":" ; OFS="-" } $7 ~ /bash$/ { print $1 , $3 }' /etc/passwd
Alle User hintereinander
  • awk 'BEGIN {FS=":" ; ORS=" "} { print $1 }' /etc/passwd
Wer hat die bash als Shell
  • awk -F : ' $7 ~ /bash$/ { print $1 }' /etc/passwd

Aufgaben

Links