Awk: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| (46 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
=Grundlegendes= | =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 | |||
Die | =awk-Anweisungen haben folgende Struktur= | ||
== | <syntaxhighlight lang="awk"> | ||
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- | = Bedingungen = | ||
Bedingungen sind in awk-Programmen entweder von der Form | |||
<syntaxhighlight lang="awk"> | <syntaxhighlight lang="awk"> | ||
Ausdruck Vergleichsoperator Ausdruck | |||
</syntaxhighlight> | </syntaxhighlight> | ||
oder von der Form | |||
<syntaxhighlight lang="awk"> | <syntaxhighlight lang="awk"> | ||
Ausdruck Matchoperator /reguläres Suchmuster/ | |||
</syntaxhighlight> | </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. B. | |||
<syntaxhighlight lang="awk"> | <syntaxhighlight lang="awk"> | ||
$1 ~ /^E/ && $2 > 20 { print $3 } | |||
</syntaxhighlight> | |||
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: | |||
<syntaxhighlight lang="awk"> | |||
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= | =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://likegeeks.com/awk-command/ | |||
Aktuelle Version vom 8. Juni 2023, 12: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