Awk-Programmiersprache unterstützt Arrays. Als Teil unserer fortlaufenden awk-Beispielserie haben wir benutzerdefinierte awk-Variablen und integrierte awk-Variablen gesehen. Arrays sind eine Erweiterung von Variablen. Arrays sind Variablen, die mehr als einen Wert enthalten. Ähnlich wie Variablen haben auch Arrays Namen. In einigen Programmiersprachen müssen Arrays deklariert werden, damit den Arrays Speicher zugewiesen wird. Außerdem sind Array-Indizes typischerweise ganzzahlig, wie array[1],array[2] usw.,
Awk-assoziatives Array
Awk unterstützt nur assoziative Arrays. Assoziative Arrays sind wie herkömmliche Arrays, außer dass sie anstelle von Zahlen Strings als Indizes verwenden. Wenn Sie ein assoziatives Array verwenden, können Sie ein herkömmliches Array nachahmen, indem Sie eine numerische Zeichenfolge als Index verwenden.
Syntax: arrayname[string]=value
In der obigen awk-Syntax:
- Arrayname ist der Name des Arrays.
- Zeichenfolge ist der Index eines Arrays.
- Wert ist ein beliebiger Wert, der dem Element des Arrays zugewiesen wird.
Auf Elemente des AWK-Arrays zugreifen
Wenn Sie auf ein bestimmtes Element in einem Array zugreifen möchten, können Sie über seinen Index zugreifen — arrayname[index], der Ihnen den in diesem Index zugewiesenen Wert gibt.
Wenn Sie auf alle Array-Elemente zugreifen möchten, können Sie wie unten gezeigt eine Schleife verwenden, um alle Indizes eines Arrays zu durchlaufen.
Syntax: for (var in arrayname) actions
In der obigen awk-Syntax:
- var ist ein beliebiger Variablenname
- in ist ein Schlüsselwort
- Arrayname ist der Name des Arrays.
- Aktionen sind eine Liste von auszuführenden Anweisungen. Wenn Sie mehr als eine Aktion ausführen möchten, müssen Sie diese in geschweifte Klammern einschließen.
Diese Schleife führt eine Liste von Aktionen für jeden unterschiedlichen Wert aus, der als Index in einem Array verwendet wurde, wobei die Variable var auf diesen Index gesetzt wurde.
Entfernen eines Elements aus dem AWK-Array
Wenn Sie ein Element in einem bestimmten Index eines Arrays entfernen möchten, verwenden Sie die Anweisung awk delete. Sobald Sie ein Element aus einem awk-Array gelöscht haben, können Sie diesen Wert nicht mehr abrufen.
Syntax: delete arrayname[index];
Der folgende Schleifenbefehl entfernt alle Elemente aus einem Array. Es gibt keine einzelne Anweisung, um alle Elemente aus einem Array zu entfernen. Sie müssen die Schleife durchlaufen und jedes Array-Element mit der awk delete-Anweisung löschen.
for (var in array) delete array[var]
5 praktische Awk-Array-Beispiele
Alle unten aufgeführten Beispiele verwenden die unten gezeigte Iplogs.txt-Datei. Diese Beispieltextdatei enthält eine Liste der vom Gateway-Server angeforderten IP-Adressen. Diese Beispieldatei Iplogs.txt enthält Daten im folgenden Format:
[date] [time] [ip-address] [number-of-websites-accessed]
$ cat Iplogs.txt 180607 093423 123.12.23.122 133 180607 121234 125.25.45.221 153 190607 084849 202.178.23.4 44 190607 084859 164.78.22.64 12 200607 012312 202.188.3.2 13 210607 084849 202.178.23.4 34 210607 121435 202.178.23.4 32 210607 132423 202.188.3.2 167
Beispiel 1. Listen Sie alle eindeutigen IP-Adressen und die Anzahl der Anfragen auf
$ awk '{ > Ip[$3]++; > } > END{ > for (var in Ip) > print var, "access", Ip[var]," times" > } > ' Iplogs.txt 125.25.45.221 access 1 times 123.12.23.122 access 1 times 164.78.22.64 access 1 times 202.188.3.2 access 2 times 202.178.23.4 access 3 times
Im obigen Skript:
- Das dritte Feld ($3) ist eine IP-Adresse. Dies wird als Index eines Arrays namens Ip verwendet.
- Für jede Zeile wird der Wert des entsprechenden IP-Adressindex erhöht.
- Schließlich wird im END-Abschnitt der gesamte Index die Liste der eindeutigen IP-Adressen sein und die entsprechenden Werte sind die Anzahl der Vorkommen.
Beispiel 2. Listen Sie alle IP-Adressen auf und berechnen Sie, auf wie viele Websites sie zugegriffen hat
Das letzte Feld in Iplogs.txt ist die Anzahl der Sites, auf die jede IP-Adresse an einem bestimmten Datum und zu einer bestimmten Uhrzeit zugegriffen hat. Das folgende Skript generiert den Bericht, der eine Liste der IP-Adressen enthält und wie oft das Gateway angefordert wurde, sowie die Gesamtzahl der Websites, auf die es zugegriffen hat.
$cat ex2.awk BEGIN { print "IP Address\tAccess Count\tNumber of sites"; } { Ip[$3]++; count[$3]+=$NF; } END{ for (var in Ip) print var,"\t",Ip[var],"\t\t",count[var]; } $ awk -f ex2.awk Iplogs.txt IP Address Access Count Number of sites 125.25.45.221 1 153 123.12.23.122 1 133 164.78.22.64 1 12 202.188.3.2 2 180 202.178.23.4 3 110
Im obigen Beispiel:
- Es hat zwei Arrays. Der Index für beide Arrays ist gleich – das ist die IP-Adresse (drittes Feld).
- Das erste Array mit dem Namen „Ip“ enthält eine Liste mit eindeutigen IP-Adressen und der Anzahl ihrer Vorkommen. Das zweite Array namens „count“ hat die IP-Adresse als Index und sein Wert ist das letzte Feld (Anzahl der Sites). Wenn also die IP-Adresse kommt, fügt es einfach das letzte Feld hinzu.
- Im END-Abschnitt durchläuft es alle IP-Adressen und gibt die IP-Adresse und die Zugriffszahl aus dem Array mit dem Namen Ip und die Anzahl der Sites aus dem Array count aus.
Beispiel 3. Identifizieren Sie den maximalen Zugriffstag
$ cat ex3.awk { date[$1]++; } END{ for (count in date) { if ( max < date[count] ) { max = date[count]; maxdate = count; } } print "Maximum access is on", maxdate; } $ awk -f ex3.awk Iplogs.txt Maximum access is on 210607
In diesem Beispiel:
- Array mit dem Namen „Datum“ hat Datum als Index und Anzahl der Vorkommen als Wert des Arrays.
- max ist eine Variable, die den Zählwert hat und verwendet wird, um das Datum herauszufinden, das die maximale Anzahl hat.
- maxdate ist eine Variable, die das Datum enthält, für das die Anzahl maximal ist.
Beispiel 4. Reihenfolge der Zeilen in einer Datei umkehren
$ awk '{ a[i++] = $0 } END { for (j=i-1; j>=0;) print a[j--] }' Iplogs.txt 210607 132423 202.188.3.2 167 210607 121435 202.178.23.4 32 210607 084849 202.178.23.4 34 200607 012312 202.188.3.2 13 190607 084859 164.78.22.64 12 190607 084849 202.178.23.4 44 180607 121234 125.25.45.221 153 180607 093423 123.12.23.122 133
In diesem Beispiel
- Es beginnt mit der Aufzeichnung aller Zeilen im Array ‚a‘.
- Wenn das Programm alle Zeilen verarbeitet hat, führt Awk den Block END { } aus.
- Der END-Block durchläuft die Elemente im Array 'a' und gibt die aufgezeichneten Zeilen in umgekehrter Weise aus.
Beispiel 5. Entfernen Sie doppelte und nicht aufeinanderfolgende Zeilen mit awk
$ cat > temp foo bar foo baz bar $ awk '!($0 in array) { array[$0]; print }' temp foo bar baz
In diesem Beispiel:
- Awk liest jede Zeile aus der Datei „temp“ und prüft mit dem „in“-Operator, ob die aktuelle Zeile im Array „a“ existiert.
- Wenn es nicht existiert, speichert und druckt es die aktuelle Zeile.
Empfohlene Lektüre