GNU/Linux >> Tutoriels Linux >  >> Linux

Commande Awk sous Linux

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.


Linux
  1. Commande Linux mv

  2. Linux du command

  3. Commande IP Linux

  4. Commande cd Linux

  5. Exemples de commandes awk sous Linux

Linux Quelle commande

Commande W sous Linux

À la commande sous Linux

Commande Linux awk avec 10 exemples

Commande Df sous Linux

Commande AWK sous Linux/Unix