AWK est l'une des commandes les plus puissantes de Linux. Vous pouvez gérer les données et générer des rapports à l'aide de la commande awk. Il nous permet également d'utiliser des opérations logiques, des variables, des fonctions d'impression et bien d'autres. AWK signifie "Aho, Weinberger et Kernighan" et est principalement utilisé pour la numérisation et le traitement de motifs. Il recherche un ou plusieurs fichiers pour voir s'ils contiennent des lignes correspondant au modèle spécifié, puis effectue les actions associées. Il lit à partir d'un fichier ou de son entrée et sortie standard vers sa sortie standard. Pour chaque ligne, il correspond au modèle donné dans l'ordre donné, si les correspondances effectuent l'action correspondante.
Caractéristiques
• Affiche un fichier texte sous forme d'enregistrements et de champs
• Il a des variables, des conditions et des boucles
• Possède des opérateurs arithmétiques et de chaîne
• Peut générer des rapports formatés
• Lire et modifier du texte à partir d'une chaîne ou d'un fichier
Dans ce didacticiel, nous allons examiner la commande AWK Linux avec des exemples et voir ce qu'elle peut faire.
Syntaxe Basix de AWK
La syntaxe de base de la commande AWK est illustrée ci-dessous :
awk options program input-file
Une brève explication de chaque option est présentée ci-dessous :
• -F fs :utilisé pour spécifier un séparateur de fichier.
• -f fichier :utilisé pour spécifier un fichier contenant le script awk.
• -v var=value :Utilisé pour déclarer une variable.
Nous utiliserons le fichier texte suivant comme fichier d'entrée pour tous les exemples de cet article :
cat > contents.txt
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
Maintenant, vérifions le contenu du fichier nommé 'contents.txt' avec la commande AWK :
awk '{print}' contents.txt
Cela imprimera le contenu du fichier comme indiqué ci-dessous :
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
Dans l'exemple ci-dessus, aucun motif n'est donné, il imprimera donc tout le fichier.
Maintenant, imprimez toutes les lignes qui correspondent au modèle "sales":
awk '/sales/ {print}' contents.txt
Cela imprimera toutes les lignes contenant le mot "ventes" comme indiqué ci-dessous :
hitesh engineer sales 30000
bhavesh engineer sales 30000
rajesh directory sales 40000
deep clerk sales 20000
Variables dans AWK
AWK est livré avec des variables intégrées qui sont utilisées pour diviser une ligne de texte en mots individuels ou en morceaux appelés champs. Certains d'entre eux sont présentés ci-dessous :
• $0 :utilisé pour toute la ligne.
• $1 :Utilisé pour le premier champ.
• $2 :Utilisé pour le second champ.
• $n :utilisé pour le nième champ.
• NR :Utilisé pour spécifier le nombre total d'enregistrements en cours.
• NF :Permet de spécifier le nombre total de champs dans l'enregistrement.
• FS :Il contient le caractère séparateur de champ et est utilisé pour diviser les champs sur la ligne d'entrée.
• RS :Il stocke le caractère séparateur d'enregistrement courant.
• OFS :Il stocke le séparateur de champ de sortie et est utilisé pour séparer les champs quand Awk les imprime.
• ORS :Il stocke le séparateur d'enregistrement de sortie et est utilisé pour séparer les lignes de sortie lorsque Awk les imprime.
Maintenant, imprimez les champs n°1 et 3 du fichier contents.txt en utilisant la syntaxe suivante :
awk '{print $1,$3}' contents.txt
Vous ne devriez voir que le premier et le troisième champ du fichier contents.txt :
hitesh sales
jayesh account
vyom purchase
bhavesh sales
rajesh sales
niraj account
jay purchase
deep sales
Vous pouvez utiliser NR avec la commande AWK pour imprimer toutes les lignes avec le numéro de ligne :
awk '{print NR,$0}' contents.txt
Sortie :
1 hitesh engineer sales 30000
2 jayesh director account 25000
3 vyom manager purchase 20000
4 bhavesh engineer sales 30000
5 rajesh directory sales 40000
6 niraj clerk account 20000
7 jay peon purchase 23000
8 deep clerk sales 20000
Vous pouvez utiliser NF pour afficher le dernier champ et $1 pour afficher le premier champ :
awk '{print $1,$NF}' contents.txt
Cela imprimera le premier et le dernier champ du fichier contents.txt :
hitesh 30000
jayesh 25000
vyom 20000
bhavesh 30000
rajesh 40000
niraj 20000
jay 23000
deep 20000
Pour imprimer le numéro de ligne de 2 à 5, utilisez la variable NR comme indiqué ci-dessous :
awk 'NR==2, NR==5 {print NR,$0}' contents.txt
Sortie :
2 jayesh director account 25000
3 vyom manager purchase 20000
4 bhavesh engineer sales 30000
5 rajesh directory sales 40000
Compter le nombre de lignes dans le fichier contents.txt à l'aide du Nr :
awk 'END { print NR } ' contents.txt
Vous devriez voir le résultat suivant :
8
Blocs DEBUT et FIN
Il existe également des blocs BEGIN et END facultatifs qui peuvent contenir des commandes à exécuter respectivement avant et après le traitement du fichier. Le bloc BEGIN est utilisé pour effectuer des actions avant le traitement des enregistrements tandis que le bloc END est utilisé pour effectuer des actions après le traitement des enregistrements.
La syntaxe de base pour utiliser les blocs BEGIN et END avec la commande AWK est illustrée ci-dessous :
awk 'BEGIN { action; } /search/ { action; } END { action; }' input_file
Vous pouvez imprimer des informations sur les champs que vous imprimez avec les blocs BEGIN et END.
L'exemple suivant imprimera le message avant et après le traitement du deuxième champ de chaque enregistrement dans le fichier contents.txt :
awk 'BEGIN { print "Start Process." }; { print $2 }; END { print "End Process." }' contents.txt
Sortie :
Start Process.
engineer
director
manager
engineer
directory
clerk
peon
clerk
End Process.
Vous pouvez également utiliser les blocs BEGIN et END pour transformer les données du fichier et les convertir en table. L'exemple suivant convertira le fichier /etc/passwd en table :
awk 'BEGIN { FS=":"; print "User\t\tUID\t\tGID\t\tHome\t\tShell\n--------------"; } {print $1,"\t\t",$3,"\t\t",$4,"\t\t",$6,"\t\t",$7;} END { print "---------\nFile Complete" }' /etc/passwd
Sortie :
User UID GID Home Shell
--------------
root 0 0 /root /bin/bash
daemon 1 1 /usr/sbin /usr/sbin/nologin
bin 2 2 /bin /usr/sbin/nologin
sys 3 3 /dev /usr/sbin/nologin
sync 4 65534 /bin /bin/sync
games 5 60 /usr/games /usr/sbin/nologin
man 6 12 /var/cache/man /usr/sbin/nologin
lp 7 7 /var/spool/lpd /usr/sbin/nologin
mail 8 8 /var/mail /usr/sbin/nologin
news 9 9 /var/spool/news /usr/sbin/nologin
uucp 10 10 /var/spool/uucp /usr/sbin/nologin
proxy 13 13 /bin /usr/sbin/nologin
www-data 33 33 /var/www /usr/sbin/nologin
---------
File Complete
Recherche conditionnelle
La commande AWK prend également en charge plusieurs instructions conditionnelles, notamment la boucle if, while, la boucle for et bien d'autres. Cela vous aidera à récupérer les lignes qui correspondent à une condition spécifique.
L'exemple suivant utilisera la condition "if" pour imprimer toutes les lignes contenant "sales" dans le troisième champ :
awk '{ if ($3 ~ /sales/) print}' contents.txt
Sortie :
hitesh engineer sales 30000
bhavesh engineer sales 30000
rajesh directory sales 40000
deep clerk sales 20000
L'exemple suivant utilisera la boucle "for" pour imprimer les trois premiers champs de chaque enregistrement, un par ligne.
awk '{ for (i = 1; i <= 3; i++) print $i }' contents.txt
Sortie :
hitesh
engineer
sales
jayesh
director
account
vyom
manager
purchase
bhavesh
engineer
sales
rajesh
directory
sales
niraj
clerk
account
jay
peon
purchase
deep
clerk
sales
L'exemple suivant utilisera la boucle "while" pour imprimer les deux premiers champs de chaque enregistrement, un par ligne.
awk '{ i = 1; while ( i <= 2 ) { print $i i++ } }' contents.txt
Sortie :
hitesh1
engineer2
jayesh1
director2
vyom1
manager2
bhavesh1
engineer2
rajesh1
directory2
niraj1
clerk2
jay1
peon2
deep1
clerk2
Traitement de la sortie d'autres commandes
Vous pouvez également utiliser la commande AWK pour analyser la sortie de l'autre commande au lieu de spécifier un nom de fichier. La commande "ip a" imprime les informations sur l'IP du système, l'adresse Mac et d'autres informations liées au réseau comme indiqué ci-dessous :
ip a s wlan0
Sortie :
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 4c:bb:58:9c:f5:55 brd ff:ff:ff:ff:ff:ff
inet 172.20.10.3/28 brd 172.20.10.15 scope global wlan0
valid_lft forever preferred_lft forever
inet6 2401:4900:1d71:ef26:8846:95b2:4ca8:aa7d/64 scope global temporary dynamic
valid_lft 600574sec preferred_lft 81574sec
inet6 2401:4900:1d71:ef26:4ebb:58ff:fe9c:f555/64 scope global dynamic
valid_lft forever preferred_lft forever
inet6 fe80::4ebb:58ff:fe9c:f555/64 scope link
valid_lft forever preferred_lft forever
Maintenant, vous pouvez utiliser la commande AWK pour imprimer uniquement l'adresse IP du système comme indiqué ci-dessous :
ip a s wlan0 | awk -F '[\/ ]+' '/inet / {print $3}
Vous devriez voir le résultat suivant :
172.20.10.3
Exemples d'avance de commande AWK
Exemple 1 : La commande AWK vous permet d'imprimer les lignes avec un nombre de caractères spécifié. Par exemple, pour imprimer des lignes de plus de 27 caractères, utilisez la commande ci-dessous :
awk 'length($0) > 27' contents.txt
Sortie :
jayesh director account 25000
bhavesh engineer sales 30000
rajesh directory sales 40000
Exemple 2 : Vérifier le cube du nombre donné
Pour imprimer le cube du nombre donné jusqu'à 5, exécutez la commande suivante :
awk 'BEGIN { for(i=1; i<=5; i++) print "Cube of",i,"is",i*i*i; }'
Sortie :
Cube of 1 is 1
Cube of 2 is 8
Cube of 3 is 27
Cube of 4 is 64
Cube of 5 is 125
Exemple 3 : Compter le nombre de lignes dans le fichier spécifié
Vous pouvez vérifier le nombre de lignes dans le fichier spécifié et l'imprimer à l'aide de la commande suivante :
awk 'END { print NR }' contents.txt
Sortie :
8
Exemple 4 : Trouvez la ligne la plus longue dans le fichier donné et imprimez le caractère
Vous pouvez trouver la ligne la plus longue dans le fichier donné et imprimer le caractère de cette ligne en utilisant la commande suivante :
awk '{ if (length($0) > max) max = length($0) } END { print max }' contents.txt
Sortie
29
Exemple 5 : Trier la première colonne d'un fichier donné
Pour trier et imprimer la première colonne du fichier contents.txt, exécutez la commande suivante :
awk -F: '{ print $1 }' contents.txt | sort
Sortie :
bhavesh engineer sales 30000
deep clerk sales 20000
hitesh engineer sales 30000
jayesh director account 25000
jay peon purchase 23000
niraj clerk account 20000
rajesh directory sales 40000
vyom manager purchase 20000
Exemple 6 : Imprimer les lignes paires
Pour imprimer uniquement les lignes paires dans le fichier contents.txt, exécutez la commande suivante :
awk 'NR % 2 == 0' contents.txt
Sortie :
jayesh director account 25000
bhavesh engineer sales 30000
niraj clerk account 20000
deep clerk sales 20000
Exemple 7 : Changer le séparateur de champs
Vous pouvez changer le séparateur de champ d'espace en | et imprimez-le avec la commande suivante :
awk 'BEGIN{OFS="|"}{print $1,$2,$3,$4}' contents.txt
Sortie :
hitesh|engineer|sales|30000
jayesh|director|account|25000
vyom|manager|purchase|20000
bhavesh|engineer|sales|30000
rajesh|directory|sales|40000
niraj|clerk|account|20000
jay|peon|purchase|23000
deep|clerk|sales|20000
Conclusion
Dans ce didacticiel, vous avez appris à utiliser la commande AWK pour faire correspondre les modèles spécifiés, puis à effectuer les actions associées. J'espère que vous avez une idée claire de la façon d'utiliser la commande AWK pour manipuler, formater et imprimer de manière sélective des fichiers texte.