logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).


L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT → ODT PDF Export

Ceci est une ancienne révision du document !


awk

(testé - smolski 18/10/2012) Le retour sur le forum est ici :

  • Lien vers le forum concernant ce tuto N'hésitez pas à y faire par de vos remarques, succès, améliorations ou échecs !
  • Objet : awk
  • Niveau requis : AVISÉ
  • Commentaires : Cet utilitaire a été créé dans le but de remplacer les commandes grep et sed.
  • Débutant, à savoir :

Utiliser GNU/Linux en ligne de commande, tout commence là !. :-)

Introduction

awk est un langage de programmation datant de 1977, date de son apparition dans le monde Unix. Il tire son nom des trois programmeurs qui l'ont développé : Alfred V. Aho, Peter J. Weinberger et Brian W. Kernighan.
Cet utilitaire a été créé dans le but de remplacer les commandes grep et sed. Sa grande souplesse lui a permis de connaître un succès immédiat. Et de nouvelles versions sont apparues au fil du temps : nawk et gawk aujourd'hui.

Aujourd'hui encore, cet utilitaire est toujours utilisé du fait de sa ressemblance avec le langage C, de sa souplesse et de sa présence sur la majorité des systèmes d'exploitation Unix. Il est encore utilisé en administration système et dans les scripts Shell en tant que commande.

Exercices

Créez le fichier1) file.txt ainsi :

touch file.txt

Et rédigez2) dedans cette liste ainsi :

cat >  file.txt <<EOS
Nom             Genre           Age
---------------------------------------
CAMILLE         M               7
CHLOE           F               12
CLARA           F               11
CLEMENT         M               7
EMMA            F               6
THEO            M               8
EOS

Extraire des colonnes

Extraire des données d'un fichier, par exemple les 2 premières colonnes :

awk '{ print $1, $2 }' file.txt
Nom Genre
--------------------------------------- 
CAMILLE M
CHLOE F
CLARA F
CLEMENT M
EMMA F
THEO M
  • $1 correspond à la première colonne, $2 la seconde, $3 la troisième…
  • $0 correspond à la ligne entière

Dans le format de la sortie, les tabulations sont remplacées par un espace qui est le séparateur de sortie par défaut.

Par défaut, les espaces et tabulations contigüs sont considérés comme un séparateur unique. Il s'agit de la seule exception.

Filtres et regexp

Précédemment, des colonnes ont été filtrées, mais awk est aussi principalement utilisé pour filtrer des lignes grâce aux syntaxes des expressions régulières.

Retrouver les lignes qui contiennent CAMILLE :

awk '/CAMILLE/ { print $1, $3, $2 }' file.txt
CAMILLE 7 M

Nota :
L'ordre des colonnes a été modifié pour l'exemple.

Un autre filtre plus complexe, rechercher les lignes qui commencent par C et qui contiennent la lettre A ou la lettre O :

awk '/^C.*[AO]/ { print $1, $3, $2 }' file.txt
CAMILLE 7 M
CHLOE 12 F
CLARA 11 F

awk est également très utile et puissant pour gérer des filtres sur des paragraphes.
Pour récupérer les lignes de CL à E, tapez :

awk '/^CL/,/^E/ { print $0 }' file.txt
CLARA F 11
CLEMENT M 7
EMMA F 6

Variables awk

awk fournit des variables utiles qui peuvent être utilisées, affichées, calculées ou assignées.

Variable NR NF

  • NR : nombre d'enregistrements (numéro de ligne).
  • NF : nombre de champs (nombre de colonnes).
awk '{ print NR, NF, $0 }' file.txt
1 3 Nom         Genre           Age
2 1 ---------------------------------------
3 3 CAMILLE             M               7
4 3 CHLOE               F               12
5 3 CLARA               F               11
6 3 CLEMENT             M               7
7 3 EMMA                F               6
8 3 THEO                M               8

Variable FS OFS

  • FS : Séparateur de champ (par défaut : espace/tabulation).
  • OFS : Séparateur de champ en sortie (par défaut : espace).
awk '/CAMILLE/ { OFS="," ; print $2,$1 }' file.txt
M,CAMILLE
À noter le caractère “;” pour séparer les instructions dans la même ligne et la façon dont on assigne une valeur à une variable (OFS=“,”).

Scripts awk

ATTENTION ! Vérifiez toujours l'écriture de chaque script donné ici avant de l'appliquer !

awk a été utilisé précédemment en mode lignes de commande. Lorsque le programme awk devient complexe, ce dernier peut être stocké dans un fichier :

 prog.awk
cat > prog.awk <<EOS
/^CL/,/^E/ { 
     print NR, $0 
}
EOS

Puis interprété grâce à l'option -f :

awk -f prog.awk file.txt
5 CLARA F 11
6 CLEMENT M 7
7 EMMA F 6

Pré et Post opérations

ATTENTION ! Vérifiez toujours l'écriture de chaque script donné ici avant de l'appliquer !

awk offre des sections pré-traitement (BEGIN) et post-traitement (END) lors de l'analyse d'un fichier. La structure du script awk est :

cat > prog.awk <<EOS
/^CL/,/^E/ 
BEGIN {
        action
}
 
/filter/,/filter/ { action }
 
{ action}
 
END {
        action
}
EOS

Donne :

awk -f prog.awk file.txt 
CLARA           F               11
CLEMENT         M               7
EMMA            F               6

Les blocs BEGIN et END ne sont pas obligatoires. Il peut y avoir un bloc BEGIN sans bloc END, un bloc END sans bloc BEGIN, ou aucun de ces 2 blocs.

Des scripts bien plus complexes peuvent alors être écrits. Par exemple, extraire 2 colonnes en remplaçant les tabulations par des “;” et afficher le nombre de lignes à la fin :

cat > prog.awk <<EOS
BEGIN { 
        FS=" "
        OFS=";"
}
{ 
        print $1, $3 
}
END { 
        printf "\nThe file has %d lines\n", NR 
}
EOS
awk -f prog.awk file.txt
 
Nom;Age
---------------------------------------;
CAMILLE;7
CHLOE;12
CLARA;11
CLEMENT;7
EMMA;6
THEO;8
 
The file has 8 lines 
ATTENTION ! Vérifiez toujours l'écriture de chaque script donné ici avant de l'appliquer !

Fonctions

Le parseur awk offre beaucoup de fonctions internes très utiles pour traiter les données.
Consulter les manuels de l'utilitaire awk pour la liste complète des fonctions internes, en voici une liste partielle :

int

Convertir une valeur en entier avec la fonction int :

awk '/CHLOE/ { print $3, int($3/5)}' file.txt
12 2

À suivre… Jojo ;-)

doc/programmation/awk.1350542355.txt.gz · Dernière modification: 18/10/2012 08:39 par smolski

Pied de page des forums

Propulsé par FluxBB