- awk-Programme bestehen immer aus Kombinationen von Anweisungsblöcken und zugehörigen Bedingungen
- Eingabedaten werden Zeile für Zeile abgearbeitet
- Anweisungsblöcke werden in geschweiften Klammern zusammengefasst
- ohne Bedingung wird die Anweisung für jede Eingabezeile ausgeführt
- ohne Anweisung wird die Standardanweisung ausgeführt (Ausgabe der Eingabezeile)
- Aufruf entweder mit einem (oder mehreren) Dateinamen:
awk '$2 == "localhost" { print $1 }' /etc/hosts
- oder Einlesen der Eingaben über Standardeingabekanal:
awk '$2 == "localhost" { print $1 }' < /etc/hosts
- Programme können als Skripte aus einer Datei geladen werden:
awk -f localhostip.awk /etc/hosts
- alternativ als Interpreter in der Shebang-Zeile: \
#!/usr/bin/awk -f
$2 == "localhost" { print $1 }
Bedingungen
- üblicherweise ein Vergleich mit einem regulären Ausdruck
- verwendet werden Extended Regular Expressions, siehe grep mit Option
-E
- Langform für Vergleich:
$0 ~ /regulärer Ausdruck/
- Kurzform für Vergleich:
/regulärer Ausdruck/
- Vergleiche:
~ = entspricht
!~ = entspricht nicht
- Vergleiche ohne reguläre Ausdrücke:
$1 == "Hallo" ist identisch zu $1 ~ /^Hallo$/
$1 > 20 Wert im ersten Feld muss größer 20 sein
- Verknüpfung mehrerer Bedingunen mit
&& bzw. ||
- Anweisungen im
BEGIN-Block werden ausgeführt, bevor die erste Zeile der Eingabedaten gelesen wird
- Anweisungen im
END-Block werden nach der letzten Zeile ausgeführt
awk '
BEGIN { print "Die IP Adresse von localhost ist: " }
$2 == "localhost" { print $1 }
END { print "Das war die IP Adresse von localhost."}
' /etc/hosts
Variablen
$0 - die komplette Zeile
$1, $2 usw. - die einzelnen Felder einer Zeile
- Felder werden defaultmäßig durch Whitespaces voneinander getrennt
- Feldtrenner kann mit folgendem Befehl geändert werden:
awk -F NEUER-FS-WERT '{ print $1}'
$FS enthält den aktuellen Feldtrenner
$FIELDWIDTHS - Eine mit Leerzeichen getrennte Liste von Feldbreiten. Wenn diese Variable gesetzt wird, werden Felder nicht mehr anhand des Feldtrenners FS getrennt, sondern nach festen Breiten. Dies ist vor allem dann sinnvoll, wenn der auszuwertende Text mit festen Breiten formatiert ist.
$NF enthält die Anzahl der Felder der aktuellen Zeile
$NR enthält die aktuelle Zeilennummer
- eigene Variablen können mit folgendem Aufruf an das Script übergeben werden:
awk -v variablenname="Wert" '{ print variablenname }' /etc/hosts
FS - Feld-Separator
OFS - Output Feld-Separator
RS - Record Separator
ORS - Output Record Separator
Beispiele
- Ermittlung der Summe von Dateigrößen von mit find gefundenen Dateien: \
find ./_site/ -name "*.html" -exec ls -l {} \; \
| awk '{ summe+=$5 } END { print summe }'
Quellen