Question 1Que produit awk '{print $1}' f ?
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
$1 est la première colonne, et $NF pointe vers la dernière colonne de cette ligne.| Forme | Signification | Exemple |
|---|---|---|
$1 | Extraire la colonne 1 | awk '{print $1}' users.txt |
$2 | Extraire la colonne 2 | awk '{print $2}' users.txt |
$NF | Extraire la dernière colonne | awk '{print $NF}' users.txt |
$0 | Extraire la ligne entière | awk '{print $0}' users.txt |
-F',' | Changer le séparateur en virgule | awk -F',' '{print $1}' csv.txt |
NR | Numéro de ligne courant | awk '{print NR, $0}' nf.txt |
NF | Nombre de champs sur la ligne | awk '{print NF}' nf.txt |
/pat/{print $1} | Afficher la colonne 1 des lignes correspondant à pat | awk '/error/{print $1}' log.txt |
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
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.
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
Vérification des connaissances
Répondez à chaque question une par une.
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 ?