AWK ::..

Introduction :.

Cette commande permet de créer des programmes structurés sous forme de scripts qui seront interprétés par le shell. On parle de langage awk et on reconnaît les fichiers script par leur extension .awk
Très souvent utilisé comme filtre pour faire des extractions formatées de fichiers et des recherches de motifs. Il est bien adapté pour faire des manipulations, des comparaisons ou pour réorganiser des données qui passent d'un système à l'autre.

Il est aussi souvent utilisé pour vider les pages des commentaires du code c, perl, html ou autres remarques ou balises.

Avec cette commande, on peut travailler en mode ligne de commande ou en script. Les fichiers contenant les scripts ont alors pour extension .awk

Plusieurs variantes pour le programme lui même :

Et pour consulter l'aide :


Travail en ligne :.

Pour travailler sur la ligne de commande on va avoir :
awk -options ' motif {actions} ' nom_du fichier

Un rappel de options :

Options POSIX :                 Options longues GNU :
        -f fichier_prog         --file=fichier_prog
        -F fs                   --field-separator=fs
        -v var=valeur           --assign=var=valeur
        -m[fr] valeur
        -O                      --optimize
        -W compat               --compat
        -W copyleft             --copyleft
        -W copyright            --copyright
        -W dump-variables[=fichier]     --dump-variables[=fichier]
        -W exec=fichier         --exec=fichier
        -W gen-po               --gen-po
        -W help                 --help
        -W lint[=fatal]         --lint[=fatal]
        -W lint-old             --lint-old
        -W non-decimal-data     --non-decimal-data
        -W profile[=fichier]    --profile[=fichier]
        -W posix                --posix
        -W re-interval          --re-interval
        -W source='programme'   --source='programme'
        -W traditional          --traditional
        -W usage                --usage
        -W use-lc-numeric       --use-lc-numeric
        -W version              --version

Structure d'une commande awk

awk -options ' BEGIN { entête, définition des var } { traitement } END { mot de la fin ou résultat } '

Un peu de pratique

Recherche dans le fichier 'messier.txt' les lignes contenant le mot 'M101' et afficher l'ensemble de la ligne grâce à $0.

On donne le séparateur avec -F" ", pour l'espace.
On donne le motif $1=="M101", pour que 1er champ trouvé soit égal à la chaîne "M101"
On imprime $0, c'est à dire toute la ligne
Et pour finir on nonne le fichier à traiter, soit 'messier.txt'


$ awk -F" " '$1=="M101" {print $0}' messier.txt
M101    Pinwheel Galaxy Spiral Galaxy   Ursa Major      5457    8.5     22      14h 3.3m        54 22   Early Spring    44      C
$ 

En dessus, voilà le résultat de notre demnade et ci-dessous une autre méthode pour chercher notre galaxie ...
Recherche la chaînes 'M101' et imprime la ligne complète.


$ awk '/M101/ {print $0}' messier.txt

Voici une autre demande avec en entête un titre, puis l'impression des champs $1,$2,$4 du fichier 'radio'


$ awk -F, 'BEGIN {print "LISTE "}; {print $1,$3,$4}' radio

En ligne, on travail souvent avec différents outils que l'on associe via le Pipe (barre verticale |).
Dans le cas suivant on affiche le catalogue messier.txt, mais seulement les champs 1,2,3,4,5 et qui comportent le mot "Ourse" sans compter sur la "case" majuscule ou minuscule ...


$ cat brillantes.txt | awk -F" " '{print $1,$2,$3,$4,$5}'|grep -i "ourse"
Grande Ourse Alpha Dubhe 1.8
Grande Ourse Beta Merak 2.4
Grande Ourse Epsilon Alioth 1.8
Grande Ourse Gamma Phecda 2.4
Grande Ourse Eta Alkaid 1.9
Petite Ourse Alpha Polaris 2
Petite Ourse Beta Kochab 2.1
$

Avec un peu d'habitude, on arrive rapidement à faire ce que l'on veut des fichiers mis à disposition.


Travail avec des scripts :.

Travaux pratiques

Comme dit plus haut, les fichiers scripts ont pour extension ".awk" Ils seront édités en par le terminal avec vim, nano et autre joe (mon préféré) ou gedit.

Sur la ligne de commande on lance donc soit un script qui fait appel à une commande awk ou directement une commande complète en ligne qui peut aussi faire appel à un script, si les commandes sont nombreuses et le lancement régulier (souvent).


..
$./go.sh
...
...
$ awk -f script -v var1 fichier.csv
...
...

Format d'un programme awk


#!/bin/bash/awk -f
# Format du programme test.awk
# JPP

BEGIN {
    print "Lancement du programme"
    }

    # zone du traitement 
    { print "Ce message s'affiche autant de fois qu'il y a de ligne dans le fichier essais.csv

END {
    print "Fin du travail"
    }
    

Ce programme sera par exemple appelé avec la commande en ligne suivante:


  $awk -f test.awk essai.csv

  

De nombreuses options et la possibilité d'utiliser des fichiers scripts donnent une puissance énorme à cette commande.
Ne pas oublier de consulter le "man awk" ou awk --help. On trouve d'excellentes documentations et de nombreux exemples sur le Web. C'est vraiment un outil formidable et hyper efficace ...