GNU/Linux >> Tutoriales Linux >  >> Linux

Arreglos AWK explicados con 5 ejemplos prácticos

El lenguaje de programación Awk admite matrices. Como parte de nuestra serie de ejemplos de awk en curso, hemos visto variables definidas por el usuario de awk y variables integradas de awk. Los arreglos son una extensión de las variables. Las matrices son variables que contienen más de un valor. Al igual que las variables, las matrices también tienen nombres. En algunos lenguajes de programación, las matrices deben declararse para que la memoria se asigne a las matrices. Además, los índices de matriz suelen ser enteros, como matriz[1], matriz[2], etc.,

Arreglo Asociativo Awk

Awk solo admite matriz asociativa. Las matrices asociativas son como las matrices tradicionales, excepto que utilizan cadenas como índices en lugar de números. Al usar una matriz asociativa, puede imitar una matriz tradicional utilizando una cadena numérica como índice.

Syntax:

arrayname[string]=value

En la sintaxis de awk anterior:

  • nombre de matriz es el nombre de la matriz.
  • cadena es el índice de una matriz.
  • valor es cualquier valor asignado al elemento de la matriz.

Acceso a elementos de la matriz AWK

Si desea acceder a un elemento en particular en una matriz, puede acceder a través de su índice:nombre de matriz [índice], que le brinda el valor asignado en ese índice.

Si desea acceder a todos los elementos de la matriz, puede usar un bucle para recorrer todos los índices de una matriz, como se muestra a continuación.

Syntax:

for (var in arrayname)
actions

En la sintaxis de awk anterior:

  • var es cualquier nombre de variable
  • en es una palabra clave
  • nombre de matriz es el nombre de la matriz.
  • acciones son una lista de sentencias a realizar. Si desea realizar más de una acción, debe encerrarse entre llaves.

Este bucle ejecuta una lista de acciones para cada valor diferente que se usó como índice en una matriz con la variable var establecida en ese índice.

Eliminar un elemento de la matriz AWK

Si desea eliminar un elemento en un índice particular de una matriz, use la instrucción awk delete. Una vez que eliminó un elemento de una matriz awk, ya no podrá obtener ese valor.

Syntax:

delete arrayname[index];

El siguiente comando de bucle elimina todos los elementos de una matriz. No existe una declaración única para eliminar todos los elementos de una matriz. Tienes que pasar por el ciclo y eliminar cada elemento de la matriz usando la instrucción awk delete.

for (var in array)
     delete array[var]

5 ejemplos prácticos de matrices Awk

Todos los ejemplos que se dan a continuación utilizan el archivo Iplogs.txt que se muestra a continuación. Este archivo de texto de muestra contiene una lista de direcciones IP solicitadas por el servidor de puerta de enlace. Este archivo de muestra Iplogs.txt contiene datos en el siguiente formato:

[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

Ejemplo 1. Enumere todas las direcciones IP únicas y la cantidad de veces que se solicitó

$ 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

En el guión anterior:

  • El tercer campo ($3) es una dirección IP. Esto se usa como un índice de una matriz llamada Ip.
  • Para cada línea, incrementa el valor del índice de dirección IP correspondiente.
  • Finalmente, en la sección FIN, todo el índice será la lista de direcciones IP únicas y sus valores correspondientes serán el recuento de ocurrencias.

Ejemplo 2. Enumere todas las direcciones IP y calcule a cuántos sitios accedió

El último campo en Iplogs.txt es la cantidad de sitios a los que accedió cada dirección IP en una fecha y hora en particular. El siguiente script genera el informe que tiene una lista de direcciones IP y cuántas veces solicitó la puerta de enlace y el número total de sitios a los que accedió.

$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

En el ejemplo anterior:

  • Tiene dos matrices. El índice para ambas matrices es el mismo, que es la dirección IP (tercer campo).
  • La primera matriz llamada "Ip" tiene una lista de direcciones IP únicas y su recuento de ocurrencias. La segunda matriz llamada "recuento" tiene la dirección IP como índice y su valor será el último campo (número de sitios), por lo que cada vez que llega la dirección IP, sigue agregando el último campo.
  • En la sección FIN, revisa todas las direcciones IP e imprime la dirección IP y el recuento de accesos de la matriz llamada IP y la cantidad de sitios de la matriz.

Ejemplo 3. Identificar el día de máximo acceso

$ 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

En este ejemplo:

  • la matriz llamada "fecha" tiene la fecha como índice y el recuento de ocurrencias como el valor de la matriz.
  • max es una variable que tiene el valor de conteo y se usa para averiguar la fecha que tiene el conteo máximo.
  • maxdate es una variable que tiene la fecha para la cual el conteo es máximo.

Ejemplo 4. Invierta el orden de las líneas en un archivo

$ 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

En este ejemplo,

  • Comienza registrando todas las líneas en la matriz 'a'.
  • Cuando el programa ha terminado de procesar todas las líneas, Awk ejecuta el bloque END { }.
  • El bloque END recorre los elementos de la matriz 'a' e imprime las líneas grabadas de manera inversa.

Ejemplo 5. Elimina líneas duplicadas y no consecutivas usando awk

$ cat > temp
foo
bar
foo
baz
bar

$ awk '!($0 in array) { array[$0]; print }' temp
foo
bar
baz

En este ejemplo:

  • Awk lee cada línea del archivo "temp", y usando el operador "in" verifica si la línea actual existe en la matriz "a".
  • Si no existe, almacena e imprime la línea actual.

Lecturas recomendadas

Sed y Awk 101 Hacks, por Ramesh Natarajan . Paso varias horas al día en un entorno UNIX/Linux lidiando con archivos de texto (datos, configuración y archivos de registro). Uso Sed y Awk para todo mi trabajo de manipulación de texto. Basado en mi experiencia con Sed y Awk, he escrito el libro electrónico Sed and Awk 101 Hacks que contiene 101 ejemplos prácticos sobre varias funciones avanzadas de Sed y Awk que mejorarán su vida en UNIX/Linux. Incluso si ha estado usando Sed y Awk durante varios años y no ha leído este libro, hágase un favor y lea este libro. Se sorprenderá con las capacidades de las utilidades Sed y Awk.


Linux
  1. Comando de apagado de Linux explicado con ejemplos

  2. Comando Traceroute de Linux, explicado con ejemplos

  3. Matrices bash con ejemplos

  4. Tutorial de Awk:Entienda las Variables de Awk con 3 Ejemplos Prácticos

  5. Tutorial de referencia y desreferenciación de matrices de Perl con ejemplos prácticos

w Comando explicado con ejemplos en Linux

Comando de espera en Linux explicado con ejemplos prácticos

10 ejemplos prácticos de expresiones regulares con grep

Explicación del comando tee de Linux (con ejemplos)

Comando lsof de Linux explicado con 12 ejemplos prácticos

Explicación del comando csplit de Linux (con ejemplos)