Apprenez en lisant dans l'ordre

awk — Extraction de champs

Pratique awk : '{print $1}' extrait une colonne, $NF récupère la dernière colonne, -F',' change le séparateur en virgule, NR et NF, et /error/{print $2} traite uniquement les lignes correspondantes — illustré et en pratique dans un terminal en navigateur.

Extraire des colonnes — $1 / $NF / -F

awk est une commande qui divise chaque ligne en colonnes (champs) par les espaces et te permet de les traiter champ par champ. En écrivant awk '{print $1}', tu extrais et affiches uniquement la première colonne de chaque ligne. Dans {}, tu écris l'action à exécuter sur chaque ligne (ici, print). $1 est la première colonne, $2 est la deuxième, et $0 désigne la ligne entière.

$NF est une façon spéciale de désigner la dernière colonne. NF est une variable qui contient le nombre de champs d'une ligne, donc $NF te donne la dernière colonne de cette ligne. Même quand le nombre de colonnes varie d'une ligne à l'autre, tu obtiens toujours la dernière. Quand le séparateur n'est pas une espace, spécifie-le avec -F, comme dans -F','. Le plus sûr est d'entourer le séparateur de guillemets (-F',').

printf 'alice 30 tokyo\nbob 25 osaka\n' > users.txt   # créer le fichier de données
awk '{print $1}' users.txt                              # colonne 1 : alice et bob
awk '{print $2}' users.txt                              # colonne 2 : 30 et 25
awk '{print $NF}' users.txt                             # dernière colonne : tokyo et osaka
printf 'alice,30\nbob,25\n' > csv.txt                  # données séparées par des virgules
awk -F',' '{print $1}' csv.txt                          # séparateur virgule, colonne 1
Comment awk compte les colonnes
alice30tokyo$1 = alice$2 = 30$NF = tokyo (dernier)
$1 est la première colonne, et $NF pointe vers la dernière colonne de cette ligne.
FormeSignificationExemple
$1Extraire la colonne 1awk '{print $1}' users.txt
$2Extraire la colonne 2awk '{print $2}' users.txt
$NFExtraire la dernière colonneawk '{print $NF}' users.txt
$0Extraire la ligne entièreawk '{print $0}' users.txt
-F','Changer le séparateur en virguleawk -F',' '{print $1}' csv.txt
NRNuméro de ligne courantawk '{print NR, $0}' nf.txt
NFNombre de champs sur la ligneawk '{print NF}' nf.txt
/pat/{print $1}Afficher la colonne 1 des lignes correspondant à patawk '/error/{print $1}' log.txt

① Crée un fichier séparé par des espaces avec printf 'alice 30 tokyo\nbob 25 osaka\n' > users.txt.

② Vérifie le contenu avec cat users.txt.

③ Utilise awk pour afficher uniquement la première colonne de chaque ligne.

④ Ensuite, utilise awk '{print $2}' users.txt pour afficher la deuxième colonne de chaque ligne.

⑤ Ensuite, utilise la forme qui désigne la dernière colonne pour afficher la dernière colonne de chaque ligne.

⑥ Crée un fichier séparé par des virgules avec printf 'alice,30\nbob,25\n' > csv.txt, puis affiche la colonne 1 en utilisant l'option qui spécifie le séparateur. (Si tu l'exécutes correctement, une explication apparaîtra.)

Linux console
0 / 7 exécutée(s)
Loading Linux Terminal...

Numéro de ligne et nombre de champs — NR / NF

NR est une variable intégrée qui contient le numéro de la ligne en cours de traitement, et NF contient le nombre de champs de cette ligne. En écrivant awk '{print NR, $0}', tu affiches chaque ligne entière avec son numéro en tête. Avec awk '{print NF}', tu peux voir combien de colonnes chaque ligne a été divisée.

printf 'red\ngreen blue\n' > nf.txt   # créer le fichier de données
awk '{print NR, $0}' nf.txt             # 1 red / 2 green blue
awk '{print NF}' nf.txt                 # ligne 1 a 1 colonne, ligne 2 a 2 colonnes

① Crée deux lignes avec des nombres de champs différents avec printf 'red\ngreen blue\n' > nf.txt.

② Avec awk, combine la variable du numéro de ligne avec la ligne entière pour afficher chaque ligne avec son numéro en tête.

③ Ensuite, affiche la variable du nombre de champs et vérifie que la ligne 1 et la ligne 2 ont des comptes différents.

Linux console
0 / 3 exécutée(s)
Loading Linux Terminal...

Traiter uniquement les lignes correspondantes — /pat/{print ...}

Quand tu écris un motif avant le programme, awk applique ce programme uniquement aux lignes correspondantes. awk '/error/{print $1}' affiche la colonne 1 uniquement pour les lignes contenant error. Là où grep affiche la ligne entière, awk peut extraire uniquement les colonnes dont tu as besoin depuis les lignes correspondantes.

Traiter uniquement les lignes avec un motif
awk '{print $1}' fcolonne 1 detoutes les lignesawk '/error/{print $1}' fcolonne 1 deslignes error seulement
Un motif avant le programme restreint les lignes qui sont traitées.
printf 'error disk\ninfo start\nerror cpu\n' > log.txt   # créer le fichier de données
awk '/error/{print $2}' log.txt                            # colonne 2 des lignes error : disk et cpu

① Crée un fichier de données avec printf 'error disk\ninfo start\nerror cpu\n' > log.txt.

② Avec awk, écris un motif avant le programme et affiche la colonne 2 uniquement pour les lignes contenant error.

③ Vérifie que les mots affichés sont uniquement les colonnes extraites des lignes error.

④ Exécute aussi grep error log.txt et compare : grep affiche la ligne entière, tandis qu'awk affiche uniquement la colonne 2.

Linux console
0 / 3 exécutée(s)
Loading Linux Terminal...
QUIZ

Vérification des connaissances

Répondez à chaque question une par une.

Question 1Que produit awk '{print $1}' f ?

Question 2Quelle option ajoutes-tu pour que awk utilise une virgule comme séparateur ?

Question 3Quelles lignes awk '/error/{print $1}' f traite-t-il ?