Awk: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| (3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 54: | Zeile 54: | ||
==Feldtrenner== | ==Feldtrenner== | ||
*-F : | *-F : | ||
| + | =Vergleiche= | ||
| + | ==kleiner== | ||
| + | *<< | ||
| + | ==grösser== | ||
| + | *<< | ||
| + | ==gleich== | ||
| + | *== | ||
= Befehle = | = Befehle = | ||
| Zeile 131: | Zeile 138: | ||
;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. | ;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 | ;Erste Zeile wird nicht ausgegeben | ||
*awk 'NR>1 { print $0 }' | *awk 'NR>1 { print $0 }' | ||
| Zeile 149: | Zeile 154: | ||
;Wer hat die bash als Shell | ;Wer hat die bash als Shell | ||
*awk -F : ' $7 ~ /bash$/ { print $1 }' /etc/passwd | *awk -F : ' $7 ~ /bash$/ { print $1 }' /etc/passwd | ||
| + | |||
| + | =Aufgaben= | ||
| + | *[[Aufgaben awk]] | ||
=Links= | =Links= | ||
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