Le langage de programmation Awk prend en charge les tableaux. Dans le cadre de notre série d'exemples awk en cours, nous avons vu des variables définies par l'utilisateur awk et des variables intégrées awk. Les tableaux sont une extension des variables. Les tableaux sont des variables qui contiennent plus d'une valeur. Semblables aux variables, les tableaux ont également des noms. Dans certains langages de programmation, les tableaux doivent être déclarés, afin que la mémoire soit allouée aux tableaux. En outre, les index de tableau sont généralement des nombres entiers, comme array[1], array[2] etc.,
Tableau associatif Awk
Awk ne prend en charge que les tableaux associatifs. Les tableaux associatifs ressemblent aux tableaux traditionnels, sauf qu'ils utilisent des chaînes comme index plutôt que des nombres. Lorsque vous utilisez un tableau associatif, vous pouvez imiter un tableau traditionnel en utilisant une chaîne numérique comme index.
Syntax: arrayname[string]=value
Dans la syntaxe awk ci-dessus :
- nom du tableau est le nom du tableau.
- chaîne est l'indice d'un tableau.
- valeur est n'importe quelle valeur assignée à l'élément du tableau.
Accéder aux éléments du tableau AWK
Si vous souhaitez accéder à un élément particulier dans un tableau, vous pouvez accéder via son index - arrayname[index], qui vous donne la valeur attribuée dans cet index.
Si vous souhaitez accéder à tous les éléments du tableau, vous pouvez utiliser une boucle pour parcourir tous les index d'un tableau, comme indiqué ci-dessous.
Syntax: for (var in arrayname) actions
Dans la syntaxe awk ci-dessus :
- var est n'importe quel nom de variable
- dans est un mot clé
- nom du tableau est le nom du tableau.
- action sont la liste des déclarations à effectuer. Si vous souhaitez effectuer plusieurs actions, elles doivent être placées entre accolades.
Cette boucle exécute la liste des actions pour chaque valeur différente qui a été utilisée comme index dans le tableau avec la variable var définie sur cet index.
Supprimer un élément du tableau AWK
Si vous souhaitez supprimer un élément dans un index particulier d'un tableau, utilisez l'instruction awk delete. Une fois que vous avez supprimé un élément d'un tableau awk, vous ne pouvez plus obtenir cette valeur.
Syntax: delete arrayname[index];
La commande loop ci-dessous supprime tous les éléments d'un tableau. Il n'y a pas d'instruction unique pour supprimer tous les éléments d'un tableau. Vous devez parcourir la boucle et supprimer chaque élément du tableau à l'aide de l'instruction awk delete.
for (var in array) delete array[var]
5 exemples pratiques de tableaux Awk
Tous les exemples donnés ci-dessous utilisent le fichier Iplogs.txt illustré ci-dessous. Cet exemple de fichier texte contient la liste des adresses IP demandées par le serveur de passerelle. Cet exemple de fichier Iplogs.txt contient des données au format suivant :
[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
Exemple 1. Répertorier toutes les adresses IP uniques et le nombre de fois qu'elles ont été demandées
$ 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
Dans le script ci-dessus :
- Le troisième champ ($3) est une adresse IP. Ceci est utilisé comme index d'un tableau appelé Ip.
- Pour chaque ligne, il incrémente la valeur de l'index d'adresse IP correspondant.
- Enfin, dans la section END, tout l'index sera la liste des adresses IP uniques et ses valeurs correspondantes sont le nombre d'occurrences.
Exemple 2. Répertoriez toutes les adresses IP et calculez le nombre de sites auxquels elles ont accédé
Le dernier champ du fichier Iplogs.txt est le nombre de sites auxquels chaque adresse IP a accédé à une date et une heure particulières. Le script ci-dessous génère le rapport qui contient la liste des adresses IP et le nombre de fois qu'il a demandé la passerelle et le nombre total de sites auxquels il a accédé.
$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
Dans l'exemple ci-dessus :
- Il a deux tableaux. L'index pour les deux tableaux est le même - qui est l'adresse IP (troisième champ).
- Le premier tableau nommé "Ip" contient une liste d'adresses IP uniques et son nombre d'occurrences. Le deuxième tableau appelé "count" a l'adresse IP comme index et sa valeur sera le dernier champ (nombre de sites), donc chaque fois que l'adresse IP arrive, il continue d'ajouter le dernier champ.
- Dans la section END, il parcourt toutes les adresses IP et imprime l'adresse IP et le nombre d'accès à partir du tableau appelé Ip et le nombre de sites à partir du nombre de tableaux.
Exemple 3. Identifier le jour d'accès maximal
$ 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
Dans cet exemple :
- le tableau nommé "date" a la date comme index et le nombre d'occurrences comme valeur du tableau.
- max est une variable qui a la valeur count et utilisée pour trouver la date qui a le nombre max.
- maxdate est une variable qui a la date pour laquelle le nombre est maximum.
Exemple 4. Inverser l'ordre des lignes dans un fichier
$ 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
Dans cet exemple,
- Il commence par enregistrer toutes les lignes du tableau "a".
- Lorsque le programme a fini de traiter toutes les lignes, Awk exécute le bloc END { }.
- Le bloc END boucle sur les éléments du tableau 'a' et imprime les lignes enregistrées de manière inversée.
Exemple 5. Supprimez les lignes en double et non consécutives à l'aide de awk
$ cat > temp foo bar foo baz bar $ awk '!($0 in array) { array[$0]; print }' temp foo bar baz
Dans cet exemple :
- Awk lit chaque ligne du fichier "temp", et en utilisant l'opérateur "in", il vérifie si la ligne actuelle existe dans le tableau "a".
- Si elle n'existe pas, elle stocke et imprime la ligne courante.
Lecture recommandée
Sed et Awk 101 Hacks, par Ramesh Natarajan . Je passe plusieurs heures par jour sur un environnement UNIX / Linux à gérer des fichiers texte (fichiers de données, de configuration et de journalisation). J'utilise Sed et Awk pour tout mon travail de manipulation de texte. Sur la base de mon expérience Sed et Awk, j'ai écrit Sed and Awk 101 Hacks eBook qui contient 101 exemples pratiques sur diverses fonctionnalités avancées de Sed et Awk qui amélioreront votre vie UNIX / Linux. Même si vous utilisez Sed et Awk depuis plusieurs années et que vous n'avez pas lu ce livre, rendez-vous service et lisez ce livre. Vous serez étonné des capacités des utilitaires Sed et Awk.