Cet article fait partie de la série d'exemples de didacticiels Awk en cours. Dans nos articles awk précédents, nous avons discuté de l'impression awk, des variables définies par l'utilisateur awk et des variables intégrées awk.
Comme tout autre langage de programmation, Awk possède également de nombreux opérateurs pour les opérations sur les nombres et les chaînes. Dans cet article, discutons de tous les principaux opérateurs awk .
Il existe deux types d'opérateurs dans Awk.
- Opérateur unaire :l'opérateur qui accepte un seul opérande est appelé opérateur unaire.
- Opérateur binaire :l'opérateur qui accepte plusieurs opérandes est appelé opérateur binaire.
Opérateur unaire Awk
Opérateur | Description |
+ | Positiver le nombre |
– | Négateur du nombre |
++ | Incrémentation automatique |
— | Décrémentation automatique |
Opérateur binaire Awk
Il existe différents types d'opérateurs binaires disponibles dans Awk. Il est classé en fonction de son utilisation.
Opérateurs arithmétiques Awk
Les opérateurs suivants sont utilisés pour effectuer des calculs arithmétiques.
Opérateur | Description |
+ | Ajout |
– | Soustraction |
* | Multiplication |
/ | Division |
% | Division modulo |
Opérateur de chaîne Awk
Pour la concaténation de chaînes, Awk a les opérateurs suivants.
Opérateur | Description |
(espace) | Concaténation de chaînes |
Opérateurs d'affectation Awk
Awk a un opérateur d'affectation et un opérateur d'affectation de raccourci comme indiqué ci-dessous.
Opérateur | Description |
= | Affectation |
+= | Affectation d'ajout de raccourci |
-= | Affectation de soustraction de raccourci |
*= | Affectation de multiplication de raccourci |
/= | Affectation de division de raccourci |
%= | Raccourci affectation de division modulo |
Opérateurs conditionnels Awk
Awk a la liste suivante d'opérateurs conditionnels qui peuvent être utilisés avec des structures de contrôle et des instructions en boucle qui seront couvertes dans l'article à venir.
Opérateur | Description |
> | Est supérieur à |
>= | Est supérieur ou égal à |
< | Est inférieur à |
<= | Est inférieur ou égal à |
<= | Est inférieur ou égal à |
== | Est égal à |
!= | N'est pas égal à |
&& | Les deux expressions conditionnelles doivent être vraies |
|| | Toute expression conditionnelle doit être vraie |
Opérateur d'expression régulière Awk
Opérateur | Description |
~ | Opérateur de correspondance |
!~ | Aucun opérateur de correspondance |
Exemples d'opérateur Awk
Passons maintenant en revue quelques exemples qui utilisent des opérateurs awk. Utilisons /etc/passwd comme fichier d'entrée dans ces exemples.
$ cat /etc/passwd gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh libuuid:x:100:101::/var/lib/libuuid:/bin/sh syslog:x:101:102::/home/syslog:/bin/false hplip:x:103:7:HPLIP system user,,,:/var/run/hplip:/bin/false saned:x:110:116::/home/saned:/bin/false pulse:x:111:117:PulseAudio daemon,,,:/var/run/pulse:/bin/false gdm:x:112:119:Gnome Display Manager:/var/lib/gdm:/bin/false
Awk Exemple 1 :Compter le nombre total de champs dans un fichier.
Le script awk ci-dessous correspond à toutes les lignes et continue d'ajouter le nombre de champs dans chaque ligne, en utilisant l'opérateur d'affectation d'ajout de raccourci. Le nombre de champs vus jusqu'à présent est conservé dans une variable nommée "total". Une fois l'entrée traitée, le modèle spécial 'END {…}' est exécuté, qui imprime le nombre total de champs.
$ awk -F ':' '{ total += NF }; END { print total }' /etc/passwd 49
Awk Exemple 2 :Compter le nombre d'utilisateurs qui utilisent le shell /bin/sh
Dans le script awk ci-dessous, il correspond au dernier champ de toutes les lignes contenant le modèle /bin/sh. L'expression régulière doit être fermée entre //. Ainsi, toutes les barres obliques (/) doivent être échappées dans l'expression régulière. Lorsqu'une ligne correspond à la variable "n", elle est incrémentée de un. Imprimé la valeur du 'n' dans la section END.
$ awk -F ':' '$NF ~ /\/bin\/sh/ { n++ }; END { print n }' /etc/passwd 2
Awk Exemple 3 : Rechercher les détails de l'utilisateur qui a le USER ID le plus élevé
Le script awk ci-dessous garde la trace du plus grand nombre dans le champ dans la variable 'maxuid' et la ligne correspondante sera stockée dans la variable 'maxline'. Une fois qu'il a parcouru toutes les lignes, il les imprime.
$ awk -F ':' '$3 > maxuid { maxuid=$3; maxline=$0 }; END { print maxuid, maxline }' /etc/passwd 112 gdm:x:112:119:Gnome Display Manager:/var/lib/gdm:/bin/false
Awk Exemple 4 :Imprimer les lignes paires
Le script awk ci-dessous traite chaque ligne et vérifie NR % 2 ==0, c'est-à-dire si NR est un multiple de 2. Il effectue l'opération par défaut qui imprime toute la ligne.
$ awk 'NR % 2 == 0' /etc/passwd libuuid:x:100:101::/var/lib/libuuid:/bin/sh hplip:x:103:7:HPLIP system user,,,:/var/run/hplip:/bin/false pulse:x:111:117:PulseAudio daemon,,,:/var/run/pulse:/bin/false
Awk Example 5.Print chaque ligne qui a le même USER ID et GROUP ID
Le script awk ci-dessous imprime la ligne uniquement si $3(USER ID) et $4(GROUP ID) sont égaux. Il vérifie cette condition pour chaque ligne d'entrée, si elle correspond, imprime toute la ligne.
$awk -F ':' '$3==$4' passwd.txt gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
Awk Exemple 6 :Imprimer les détails de l'utilisateur qui a un USER ID supérieur ou égal à 100 et qui doit utiliser /bin/sh
Dans l'instruction Awk ci-dessous, il y a deux expressions conditionnelles, l'une est l'identifiant de l'utilisateur ($3) supérieur ou égal à 100, et la seconde est le dernier champ doit correspondre à /bin/sh , '&&' est à imprimer uniquement si les deux ci-dessus les conditions sont vraies.
$ awk -F ':' '$3>=100 && $NF ~ /\/bin\/sh/' passwd.txt libuuid:x:100:101::/var/lib/libuuid:/bin/sh
Awk Exemple 7 :Imprimer les détails de l'utilisateur qui n'a pas les commentaires dans le fichier /etc/passwd
Le script Awk ci-dessous lit chaque ligne et vérifie que le cinquième champ est vide, s'il est vide, il imprime la ligne.
$awk -F ':' '$5 == "" ' passwd.txt libuuid:x:100:101::/var/lib/libuuid:/bin/sh syslog:x:101:102::/home/syslog:/bin/false saned:x:110:116::/home/saned:/bin/false
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.