Wir bezeichnen die Sprache als AWK und das ausführbare Programm, das AWK-Programme interpretiert, als awk oder gawk.
Ein AWK-Programm besteht aus Muster-Aktions-Paaren
pattern1 { action1 }
pattern2 { action2 }
...
Ein Muster kann ein regulärer Ausdruck sein, mit dem die Eingabe abgeglichen wird. Es kann auch ein beliebiger Ausdruck sein, der einen Wahrheitswert (wahr/falsch) ergibt.
Eine Aktion besteht aus einem oder mehreren AWK-Befehlen. Die umschließenden geschweiften Klammern sind erforderlich.
Ist das Ergebnis des Musters wahr, wird die zugehörige Aktion ausgeführt.
AWK zerlegt die Eingabe in eine Folge von Datensätzen. Jeder Datensatz wird in null oder mehr Felder aufgeteilt.
Standardmäßig gilt:
Das Muster kann weggelassen werden; in diesem Fall wird die Aktion für jeden Eingabedatensatz ausgeführt.
Die Aktion kann weggelassen werden; in diesem Fall besteht die Standardaktion darin, den aktuellen Datensatz auszugeben.
Es gibt zwei spezielle Muster, die häufig verwendet werden.
BEGIN führt die zugehörige Aktion aus, bevor eine Eingabe verarbeitet wird.END führt die zugehörige Aktion aus, nachdem die gesamte Eingabe verarbeitet wurde.Auf Felder verweist du mit $1, $2, $3 usw.
Der aktuelle Datensatz ist $0.
Um es klar zu sagen: Das sind streng genommen keine „Variablen“.
Das $ kann man als Operator auffassen, der den Wert der angegebenen Feldnummer liefert.
In späteren Konzepten gehen wir genauer darauf ein.
Hier sind einige weitere häufig verwendete eingebaute Variablen.
RS ist der Eingabe-Datensatztrenner.
Wie erwähnt, ist sein Standardwert der Zeilenumbruch.FS ist der Eingabe-Feldtrenner.Diese Variablen werden oft im BEGIN-Aktionsblock gesetzt.
Diese Variablen werden von AWK während der Ausführung des Programms automatisch gesetzt.
NF speichert die Anzahl der Felder im aktuellen Datensatz.
$NF.NR speichert die aktuelle Datensatznummer.
NR die Gesamtzahl der bisher verarbeiteten Datensätze.FNR speichert die aktuelle Datensatznummer der aktuellen Eingabedatei.
NR == FNR {action}
Das bedeutet: „wenn die aufsummierte Datensatznummer der Datensatznummer der aktuellen Datei entspricht“.
Das kann nur für Datensätze in der ersten Eingabedatei wahr sein.AWK verwendet dasselbe Konzept der Wahrheitswertigkeit wie C:
0 ist falsch.Da AWK eine Sprache zur Textverarbeitung ist, werden Wahrheitswerte auf Strings ausgedehnt.
"" ist falsch.AWK verwendet dasselbe Konzept der Wahrheitswertigkeit wie C
AWK entstand in den 1970er Jahren in den Bell Labs, im selben Umfeld, in dem C erfunden wurde. C hatte großen Einfluss auf die Syntax von AWK.
Eine Besonderheit, auf die du achten solltest
0 ist falsch."0" ist wahr!Auf die Datentypen von AWK gehen wir in späteren Konzepten genauer ein.
Kommentare beginnen mit dem Zeichen # und reichen bis zum Ende der Zeile.
awk Eingabe übergibstawk kann Eingaben aus Dateien oder von der Standardeingabe lesen.
Jede dieser Techniken funktioniert.
awk '/regex/ {print $1}' file1 file2 ...
awk '/regex/ {print $1}' < file
some_command_here | awk '/regex/ {print $1}'
Auf Unix-ähnlichen Systemen enthält /etc/passwd Informationen über Benutzer.
Jeder Benutzer wird in einer eigenen Zeile beschrieben, wobei die Felder durch Doppelpunkte getrennt sind.
So listest du die Benutzernamen:
awk '
BEGIN { FS = ":" }
{ print $1 }
' /etc/passwd
Beachte, dass die Aktion {print $1} kein Muster hat und daher für jeden Datensatz ausgeführt wird.
Wenn wir die Ausgabe auf Benutzer beschränken wollen, die bash als Login-Shell verwenden, geht das so:
awk '
BEGIN { FS = ":" }
$7 == "/bin/bash" { print $1 }
' /etc/passwd
Hier sind einige awk-Programme, die dieselben Ergebnisse liefern wie andere gängige Unix-Befehle.
Eine Datei anzeigen
cat file.txt
awk '1' file.txt
In einer Datei nach Mustern suchen
grep 'foo.*bar' file.txt
awk '/foo.*bar/' file.txt
Nur die ersten paar Zeilen einer Datei anzeigen
head -n 20 file.txt
awk '
1
NR == 20 {exit}
' file.txt
Text in einer Datei ersetzen
sed 's/foo/bar/' file.txt
awk '{sub(/foo/, "bar")};1' file.txt
# or more readably
awk '
{
sub(/foo/, "bar")
print
}
' file.txt