Linux AWK pour les débutants

Awk permet de traiter des fichiers texte, c’est presque un langage de programmation tellement il est puissant et permet de faire des chose incroyables en ligne de commande et encore plus dans un script shell.

Quand a-t-on besoin de Awk?

Quand vous avez des fichier de type texte, et qui sont une suite de lignes de même format, typiquement un fichier CSV, que vous devez faire un traitement sur ce fichier afin d’afficher les informations sur un autre format.

Par exemple soit un fichier CSV, qu’on doit transformer en requête SQL afin de faire un import de ce fichier SQL dans une base de données, vous me direz il est possible d’importer un fichier CSV dans PhpMyadmin par exemple, je vous dirai oui mais si vous deviez faire une transformation quelconque?

Soit le fichier texte suivant :

gold     1    1986  USA                 American Eagle
gold     1    1908  Austria-Hungary     Franz Josef 100 Korona
silver  10    1981  USA                 ingot
gold     1    1984  Switzerland         ingot
gold     1    1979  RSA                 Krugerrand
gold     0.5  1981  RSA                 Krugerrand
gold     0.1  1986  PRC                 Panda
silver   1    1986  USA                 Liberty dollar
gold     0.25 1986  USA                 Liberty 5-dollar piece
silver   0.5  1986  USA                 Liberty 50-cent piece
silver   1    1987  USA                 Constitution dollar
gold     0.25 1987  USA                 Constitution 5-dollar piece
gold     1    1988  Canada              Maple Leaf

A première vue ce fichier est de type à séparation par tabulation, car les champs commencent à des positions bien définies, nous allons faire des traitement avec Awk sur ce fichier puis, nous allons transformer en requête SQL chaque ligne.

Commandes basiques de awk

$ awk '/gold' test.txt

ce qui est équivalent à

$ grep gold coins.txt

Si vous ne connaissez pas la commande grep, cette dernière cherche une chaine de caractère dans un fichier ou des fichiers. On fait une recherche de la chaine et on l’affiche. Donc jusqu’ici rien d’extraordinaire, car grep peut le faire. Voyons voir, et si on n’affichait que quelques colonnes, comme la première et  la troisième?

awk '{print $1,$3}' text.txt
gold 1986
gold 1908
gold 1984
gold 1979
gold 1981
gold 1986
gold 1986
gold 1987
gold 1988

On n’est pas obligé d’afficher dans l’ordre, il importe peu, ce qui commence par un signe $, c’est une capture de champ,

awk '{print $3,$2}' test.txt

Le pattern général de awk est:
awk search pattern { program actions } fichier

Par défaut si vous mettez une virgule entre les captures de champs, il y a un espace qui les sépare. Mais comment fiat-on si on a plusieurs espaces?

awk -F";" '{print $1 "    " $3}' test.txt

Création d’une requête SQL avec Awk

Nous allons maintenant faire quelque chose de plus intéressant, transformer ce fichier en une requête SQL. Nous allons donc carrément mettre du SQL dans la commande Awk:

awk -F'\t' '{ print "INSERT INTO prospects (prenom,nom,civilite,email,service,random_id) VALUES (" $3","$2","$4","$1","$5","$6 ")" }' test> import.sql
Retour en haut