GNU/Linux >> LINUX-Kenntnisse >  >> Linux

AWK-Arrays erklärt mit 5 praktischen Beispielen

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

Sed- und Awk-101-Hacks, von Ramesh Natarajan . Ich verbringe mehrere Stunden am Tag in einer UNIX/Linux-Umgebung mit dem Umgang mit Textdateien (Daten-, Konfigurations- und Protokolldateien). Ich verwende Sed und Awk für alle meine Textbearbeitungsarbeiten. Basierend auf meiner Sed- und Awk-Erfahrung habe ich das Sed and Awk 101 Hacks eBook geschrieben, das 101 praktische Beispiele zu verschiedenen erweiterten Funktionen von Sed und Awk enthält, die Ihr UNIX / Linux-Leben verbessern werden. Auch wenn Sie Sed und Awk seit mehreren Jahren verwenden und dieses Buch noch nicht gelesen haben, tun Sie sich bitte einen Gefallen und lesen Sie dieses Buch. Sie werden von den Möglichkeiten der Dienstprogramme Sed und Awk begeistert sein.


Linux
  1. Befehl zum Herunterfahren von Linux mit Beispielen erklärt

  2. Linux Traceroute-Befehl, erklärt mit Beispielen

  3. Bash-Arrays mit Beispielen

  4. Awk-Tutorial:Awk-Variablen verstehen mit 3 praktischen Beispielen

  5. Perl-Array-Referenz- und Dereferenzierungs-Tutorial mit praktischen Beispielen

w Befehl mit Beispielen in Linux erklärt

Wait-Befehl in Linux mit praktischen Beispielen erklärt

10 praktische Beispiele für Regex mit grep

Linux tee-Befehl erklärt (mit Beispielen)

Linux-lsof-Befehl erklärt mit 12 praktischen Beispielen

Linux csplit Befehl erklärt (mit Beispielen)