awk
„Awk“ wurde von Knoppi (Diskussion) als in Bearbeitung markiert. Um Bearbeitungskonflikte zu vermeiden, kontaktiere Knoppi (Diskussion) bitte, bevor du den Artikel bearbeitest.
awk ist eine Programmiersprache, bzw. Programm, zur Dateibearbeitung, Analyse und Auswertung von Texten auf der Grundlage von Mustererkennung, regular expressions (regex). Es bearbeitet hauptsächlich Zeichenketten, Strings. Dafür besteht in awk die Möglichkeit z.B. Verzweigungen und Schleifen, auch in selbstdefinierten Funktionen zu programmieren. Der Name ist aus den Anfangsbuchstaben der Nachnamen der drei Autoren Alfred V. Aho, Peter J. Weinberger und Brian W. Kernigham zusammengesetzt.
Awk gibt es seit Unix Version 3 - 1977. 1984 wurde von den selben Autoren eine neuere Version, nawk, herausgebracht. Die Version hier auf Archlinux basiert auf gawk von GNU, 1989.
Installation
Das Programm ist als
awk
in core
verfügbar, und kann von dort
mittels Pacman
installiert werden.
Da awk im core-Paket ist, sollte es direkt zur Verfügung stehen, so dass es nicht mehr explizit installiert werden muss.
Verwendung
Die Syntax zum Starten von awk hat zwei Formen:
awk [Optionen] 'Skript' var=wert Datei(en) awk [Optionen] -f Skriptdatei var=wert Datei(en
Im Terminal könnt Ihr direkt ein Skript angeben oder solch ein Skript in einer Skriptdatei speichern und mit der Option -f angeben. Auch mehrere -f-Skripten sind erlaubt. Werte können auch auf der Kommandozeile einer Variablen zugewiesen werden. Das kann ein String- oder numerische Konstante, eine Shellvariable ($Name) oder eine Befehlsersetzung ("Befehl") sein - er steht aber erst nach der Ausführung der Anweisung BEGIN zur Verfügung. awk behandelt mehrere Datei(en). Wenn keine angegeben werden/wird, liest awk von der Standardeingabe.
Folgende Optionen werden erkannt:
awk -Ffs
Setzt das Feldtrennzeichen auf fs. Dies entspricht der awk-internen Variablen FS. Jede Eingabezeile bzw. jeder Datensatz wird durch Whitespace (Leerzeichen oder Tabulatoren) oder ein anderes benutzerdefiniertes Trennzeichen in Felder unterteilt. Die einzelnen Felder werden über die Variablen $1, $2,..., $n angesprochen. $0 bezieht sich auf den gesamten Datensatz.
awk -v var=Wert
Der Wert wird der Variablen var zugewiesen. Dies ermöglicht eine Zuweisung, bevor die Ausführung des Scripts beginnt.
Beispiel
Um z.B. die ersten drei (durch einen Doppelpunkt getrennten) Felder aller Datensätze jeweils auf einer eigenen Zeile auszugeben, benutzt den folgenden Befehl (als Beispiel):
fs = : awk -F: '{ print $1, $2, $3 }' /etc/passwd
ergibt:
root x 0 bin x 1 . . .
Die Ausgabe kann natürlich auch in eine Datei umgelenkt werden:
awk -F: '{ print $1 }' /etc/passwd > passwd.txt
oder mittels Pipe, |, an ein anderes Programm oder aufs Netz weitergegeben werden:
awk -F: '{ print $1 }' /etc/passwd | sort
gibt das Ergebnis sortiert auf der Standardausgabe aus. Oder auch sortiert in eine Datei:
awk -F: '{ print $1 }' /etc/passwd | sort > passwd.txt
Muster und Prozeduren
awk-Skripten bestehen aus Muster und Prozeduren:
Muster { Prozedur }
Beide sind optional. Sollte Muster fehlen, wird { Prozedur } auf alle Zeilen angewendet. Fehlt { Prozedur }, wird die gefundene Zeile ausgegeben.
Muster
Folgende Formen können Muster sein:
/regulärer Ausdruck/ Ausdruck für einen Vergleich Ausdruck zur Mustererkennung BEGIN END
- Ausdrücke können Strings (in Anführungszeichen) Zahlen, Operatoren, Funktionen, benutzerdefinierte oder vordefinierte Variablen sein.
- Reguläre Ausdrücke (englisch regular expression - regex) verwenden u.a. den erweiterten Satz von Metazeichen.
- ^ und $ beziehen sich auf den Anfang und das Ende eines Strings und nicht auf Anfang und Ende einer Zeile. Diese Metazeichen finden nicht einen Zeilenvorschub mitten in einem String.
- Mit dem Muster BEGIN können Prozeduren angegeben werden, die vor der Bearbeitung der ersten Eingabezeile ausgheführt werden
- Mit dem Muster END könnt ihr Prozeduren angeben, die nach der Bearbeituing der letzten Eingabezeile ausgeführt werden.
BEGIN und END können in gawk mehrfach auftreten.
Prozeduren
Prozeduren bestehen aus einem oder mehreren Befehlen, Funktionen oder Variablenanweisungen. Sie werden durch Zeilenumbrüche oder Semikola voneinander getrennt und in geschweiften Klammern eingeschlossen. Es gibt fünf verschiedene Gruppen der Befehle:
- Variablen- oder Arrayanweisungen
- Ein- und Ausgabebefehle
- integrierte Funktionen
- Steuerflußbefehle
- benutzerdefinierte Funktionen
Ein paar einfache Beispiele
Gibt das erste Feld jeder Zeile aus:
{ print $1 } awk -F: '{ print$1 }' /etc/passwd
Ausgabe:
root bin daemon mail ftp http etc.
Gibt alle Zeilen aus, die das Muster enthalten:
/TABLE/ awk /TABLE/ /pfad-zu/sql-datei
Ausgabe:
DROP TABLE IF EXISTS `cae1_action_logs`; CREATE TABLE `cae1_action_logs` ( DROP TABLE IF EXISTS `cae1_action_logs_extensions`; CREATE TABLE `cae1_action_logs_extensions` ( etc.
Gibt das erste Feld aller Zeilen aus, die das Muster enthalten:
/sum/ { print $1 } awk '/sum/ { print $1 }' /pfad-zu/quelldatei.c
Ausgabe:
unsigned sum sum if(sum if(sum printf("%lu\n",
Sucht alle Datensätze, die mehr als n Felder haben:
NF > n awk 'NF > 7' /pfad-zu/quelldatei.c
Ausgabe:
unsigned long sum = 0, innen = 0, aussen = 0, von = 0, bis = 0; printf("\n\n\n\nDie vollkommenen Zahlen von %lu bis %lu sind\n\n", von, bis); for(aussen = von; aussen <= bis; aussen++) { for(innen = 1; innen <= aussen/2; innen++) {
Interpretiert die Datensätze als eine Gruppe von Zeilen bis zu einer Leerzeile. Jede Zeile wird so zu einem einzigen Feld:
BEGIN { FS = "\n"; RS = "" } awk 'BEGIN { FS = "\n"; RS = "" } { print $1 }' /pfad-zu/quelldatei.c
Ausgabe:
#include <stdio.h> int main(char **argv, int argc) { printf("\n\n\nErmittlung von vollkommenen Zahlen\n"); printf("\nVollkommene Zahlen von ? "); printf("\n\n\n\nDie vollkommenen Zahlen von %lu bis %lu sind\n\n", von, bis); for(aussen = von; aussen <= bis; aussen++) {
Gibt die Felder zwei und drei aus, wenn erstes Feld mit dem String int übereinstimmt:
$1 ~ /int/ { print $2, $3 } awk '$1 ~ /int/ { print $2, $3 }' /pfad-zu/quelldatei.c
Ausgabe:
main(char **argv, von vollkommenen Zahlen von Zahlen bis vollkommenen Zahlen sum);
Und jetzt das ganze umgekehrt - zuerst $3 dann $2:
awk '$1 ~ /int/ { print $3, $2 }' /pfad-zu/quelldatei.c
Ausgabe:
**argv, main(char vollkommenen von von Zahlen bis Zahlen Zahlen vollkommenen sum);
Zählt die Anzahl der gefundenen Muster und gibt das Ergebnis aus:
/print/ { ++x } END { print x } awk '/print/ { ++x } END { print x }' /pfad-zu/quelldatei.c
Ausgabe:
6
Und noch ein letztes Beispiel - gibt die Felder aller Datensätze/Zeilen in umgekehrter Reihenfolge aus, pro Zeile:
{ for (i = NF; i >= 1; i--) print $i } awk '{ for (i = NF; i >= 1; i--) print $i }' /pfad-zu/quelldatei.c
Ausgabe:
<stdio.h> #include { argc) int **argv, main(char int 0; etc.
Es wird quasi jede Zeile auseinandergenommen.
Noch ein paar wichtige Optionen von awk
Awk verfügt über eine große Anzahl Optionen. Im folgenden werden ein paar aufgeführt, die öfters benutzt werden.
-d --dump-variable[=Datei]
Nach der Ausführung des Programms wird eine sortierte Liste der Globalen Variablen, ihrer Typen und ihrer letzten Werte in Datei ausgegeben. Wird keine Datei angegeben, ist die Vorgabe awkvars.out.
-g --gen-po
Liest das awk-Programm und gibt alle Strings, die als übersetzbar markiert wurden, in Form einer GNU gettext Portable Object-Datei auf die Standardausgabe aus.
-h --help
Gibt eine Anwenderbeschreibung auf der Konsole aus.
-L --lint[=fatal]
Aktiviert die Prüfung auf nicht portable oder zweifelhafte Konstrukte, sowohl wenn das Programm gelesen wird, als auch während der Ausführung. Mit dem Argument fatal werden die lint-Warnungen fatale Fehler.
-p --profile[=Datei]
awk gibt eine formatierte ("prettyprinted") Version des Programms in die Datei aus. Die Voereinstellung ist awk-prof.out.
-P --posix
Schaltet die strikte POSIX-Portabilität an, bei der weder gebräuchliche noch gawk-spezifische Erweiterungen zulässig sind.
-e 'Programmtext' --source[= 'Programmtext' ]
Programmtext wird als Quellcode für awk verwendet. Mit der Option -f könnt ihr diese Option einsetzen, um Kommandozeilenprogramme mit awk-Bibliotheken zu mischen.
-c --traditional
Alle gawk-spezifischen Erweiterungen werden abgeschaltet, aber gebräuchliche Erweiterungen erlaubt (z.B. der **-Operator für die Exponentierung)