Awk: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(23 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 50: Zeile 50:
 
*FS Feldtrennzeichen, default: Leerzeichen und Tab
 
*FS Feldtrennzeichen, default: Leerzeichen und Tab
 
*OFS Feldtrennzeichen für die Ausgabe, default: Leerzeichen
 
*OFS Feldtrennzeichen für die Ausgabe, default: Leerzeichen
 +
 +
=Optionen=
 +
==Feldtrenner==
 +
*-F :
 +
=Vergleiche=
 +
==kleiner==
 +
*<<
 +
==grösser==
 +
*<<
 +
==gleich==
 +
*==
  
 
= Befehle =
 
= Befehle =
Zeile 92: Zeile 103:
  
 
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.
 
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 =
 
= Beispiele =
Zeile 103: Zeile 125:
 
<pre>
 
<pre>
 
Muenchen - Nuernberg 2 : 1 68000 Zuschauer
 
Muenchen - Nuernberg 2 : 1 68000 Zuschauer
Union - Moenchengladbach 1 : 1 21000 Zuschauer
+
Union - Moenchengladbach 1 : 2 21000 Zuschauer
Berlin -  Homburg 1 : 0 70000 Zuschauer
+
Berlin -  Schalke 1 : 2 70000 Zuschauer
 
Freiburg - Bremen 3 : 3 32000 Zuschauer
 
Freiburg - Bremen 3 : 3 32000 Zuschauer
 
Leverkusen - Dortmund 1 : 2 29000 Zuschauer
 
Leverkusen - Dortmund 1 : 2 29000 Zuschauer
Zeile 110: Zeile 132:
 
Leipzig - Koeln 1 : 3 45000 Zuschauer
 
Leipzig - Koeln 1 : 3 45000 Zuschauer
 
Frankfurt - Hoffenheim 2 : 1 40000 Zuschauer
 
Frankfurt - Hoffenheim 2 : 1 40000 Zuschauer
Duesseldorf - HSV 3 : 1 42000 Zuschauer
+
Duesseldorf - MSV 1 : 3 42000 Zuschauer
 
</pre>
 
</pre>
 +
 
=Beispiele=
 
=Beispiele=
 
;Wenn das 4. Feld grösser als das 6. ist, wird das 1. Feld ausgegeben.
 
;Wenn das 4. Feld grösser als das 6. ist, wird das 1. Feld ausgegeben.
*awk '$4 > $6 { print $1 }' partien.txt ;
+
*awk '$4 > $6 { print $1 }' partien.txt  
;Wenn das 4. Feld kleiner als das 6. ist, wird das 3. Feld ausgegeben.
 
*awk '$4 < $6 { print $3 }' partien.txt
 
;Wenn das 4. Feld gleich dem 6. ist, wird das 1.,2.,3. Feld ausgegeben.
 
*awk '$4 = $6 { print $1 " " $2 " " $3 }' partien.txt
 
 
;Feld 1, 7 und 8 werden mit Text dazwischen ausgegeben.
 
;Feld 1, 7 und 8 werden mit Text dazwischen ausgegeben.
awk '{ print $1 " hatte ein Heimspiel mit  " $7 " " $8} ' partien.txt
+
*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=
 
=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://de.wikipedia.org/wiki/Awk
 
*https://www-user.tu-chemnitz.de/~hot/unix_linux_werkzeugkasten/awk.html
 
*https://www-user.tu-chemnitz.de/~hot/unix_linux_werkzeugkasten/awk.html
 
*https://likegeeks.com/awk-command/
 
*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