Awk: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| (38 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 | ||
| Zeile 26: | Zeile 29: | ||
= Variablen und Funktionen = | = 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 = | = 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 | ||
| 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 63: | 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 74: | Zeile 125: | ||
<pre> | <pre> | ||
Muenchen - Nuernberg 2 : 1 68000 Zuschauer | Muenchen - Nuernberg 2 : 1 68000 Zuschauer | ||
Union - Moenchengladbach 1 : | Union - Moenchengladbach 1 : 2 21000 Zuschauer | ||
Berlin - | 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 81: | 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 - | 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 | ||
; | ;Feld 1, 7 und 8 werden mit Text dazwischen ausgegeben. | ||
*awk '$ | *awk '{ print $1 " hatte ein Heimspiel mit " $7 " " $8} ' partien.txt | ||
; | ;Alle Zuschauer | ||
*awk '$ | *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