Awk: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| (44 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 = | = 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 | + | =awk-Anweisungen haben folgende Struktur= |
<syntaxhighlight lang="awk"> | <syntaxhighlight lang="awk"> | ||
Bedingung { Anweisungsblock } | Bedingung { Anweisungsblock } | ||
</syntaxhighlight> | </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 | |
| − | kann | ||
<syntaxhighlight lang="awk"> | <syntaxhighlight lang="awk"> | ||
{ Anweisungsblock } | { Anweisungsblock } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| − | + | *Es kann auch nur aus einer Bedingung bestehen | |
| − | |||
<syntaxhighlight lang="awk"> | <syntaxhighlight lang="awk"> | ||
Bedingung | Bedingung | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| − | + | = Variablen und Funktionen = | |
| − | + | *Variablen werden bei der Belegung definiert | |
| − | + | *Gültigkeitsbereich ist in Regel global | |
| − | Funktionen können an beliebiger Stelle definiert werden | + | *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 | ||
| − | Funktionen und | + | ;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"> | <syntaxhighlight lang="awk"> | ||
print $2 | print $2 | ||
</syntaxhighlight> benutzt. | </syntaxhighlight> benutzt. | ||
| − | + | = Bedingungen = | |
Bedingungen sind in awk-Programmen entweder von der Form | Bedingungen sind in awk-Programmen entweder von der Form | ||
<syntaxhighlight lang="awk"> | <syntaxhighlight lang="awk"> | ||
| Zeile 53: | Zeile 87: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| − | Reguläre 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. | Darüber hinaus können Bedingungen mit logischen Verknüpfungen zu neuen Bedingungen zusammengesetzt werden, z. B. | ||
| Zeile 64: | Zeile 104: | ||
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. | ||
| − | == Beispiele | + | = 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: | Einige einfache Programmbeispiele, die man z. B. unter Linux einfach in einer Shell eingeben kann: | ||
<syntaxhighlight lang="awk"> | <syntaxhighlight lang="awk"> | ||
| Zeile 70: | Zeile 121: | ||
echo Hallo Welt | awk '{print $2}' | 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, 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