Outils avancés de traitement du texte
Dans ce chapitre sur les outils avancés de traitement du texte on s’intéressa aux expressions rationnelles (regexp) et aux commandes grep
, sed
et awk
.
1. Recherche de texte
1.1. Commande grep
Historiquement, le nom provient de l’une des commandes de l’éditeur de texte ed disponible sur UNIX, dont la syntaxe est :
:g/re/p
Cette commande signifie : “rechercher globalement les correspondances avec l’expression rationnelle (en anglais, regular expression), et imprimer (print) les lignes dans lesquelles elle correspond”. Par défaut, grep se comporte très exactement comme cette commande. Toutefois, de nombreuses options en ligne de commande permettent de changer son comportement.
D’après d’autres sources, le nom grep serait en fait l’acronyme de “General Regular Expression Processor”, ce qui signifie “Processeur d’Expressions Rationnelles Générique”.
grep, egrep, fgrep - Afficher les lignes correspondant à un motif donné.
On ira lire utilement man grep
et info grep
.
1.2. SYNOPSIS
grep [ -[[AB] ]num ] [ -[CEFGVBchilnsvwx] ] [ -e ] motif | -f ] [ fichiers... ]
grep
recherche dans les fichiers d’entrée indiqués les lignes correspondant à un certain motif.
Si aucun fichier n’est fourni, ou si le nom “-“ est mentionné, la lecture se fait depuis l’entrée standard.
Par défaut, grep
affiche les lignes correspondant au motif.
Il existe trois variantes principales de grep
, contrôlées par les options suivantes.
-G
: Interprète le motif comme une expression rationnelle simple (voir plus bas). C’est le comportement par défaut.-E
: Interprète le motif comme une expression rationnelle étendue (voir plus bas).-F
: Interprète le motif comme une liste de chaînes figées, séparées par des Sauts de Lignes (NewLine). La correspondance est faite avec n’importe laquelle de ces chaînes.
De plus, il existe deux variantes du programme : egrep
et fgrep
. Egrep
est similaire (sans être identique) à grep -E
, et est compatible avec les versions UNIX historiques de egrep
. Fgrep
est identique à grep -F
.
Toutes les variantes de grep acceptent les options suivantes :
-num
: Les correspondances seront affichées avec num lignes supplémentaires avant et après. Néanmoins,grep
n’affichera jamais une ligne plus d’une fois.-A num
: Afficher num lignes supplémentaires après la ligne correspondante.-B num
: Afficher num lignes supplémentaires avant la ligne correspondante.-C
: est équivalent à -2.-V
: Afficher le numéro de version de grep sur la sortie d’erreur standard. Ce numéro de version devra être inclus dans tous les rapports de bogues (voir plus bas).-b
: Avant chaque ligne, afficher son décalage (en octet) au sein du fichier d’entrée.-c
: Ne pas afficher les résultats normaux. À la place, afficher un compte des lignes correspondantes pour chaque fichier d’entrée. Avec l’option-v
(voir plus bas), afficher les nombres de lignes ne correspondant pas au motif.-e motif
: Utiliser le motif indiqué. Ceci permet de protéger les motifs commençants par -.-f fichier
: Lire le motif dans le fichier indiqué.-h
: Ne pas afficher le nom des fichiers dans les résultats lorsque plusieurs fichiers sont parcourus.-i
: Ignorer les différences majuscules/minuscules aussi bien dans le motif que dans les fichiers d’entrée.-L
: Ne pas afficher les résultats normaux. À la place, indiquer le nom des fichiers pour lesquels aucun résultat n’aurait été affiché.-l
: Ne pas afficher les résultats normaux. À la place, indiquer le nom des fichiers pour lesquels des résultats auraient été affiches.-n
: Ajouter à chaque ligne de sortie un préfixe contenant son numéro dans le fichier d’entrée.-q
: Silence. Ne pas afficher les résultats normaux.-s
: Ne pas afficher les messages d’erreurs concernant les fichiers inexistants ou illisibles.-v
: Inverser la mise en correspondance, pour sélectionner les lignes ne correspondant pas au motif.-w
: Ne sélectionner que les lignes contenant une correspondance formant un mot complet. La sous-chaîne correspondante doit donc être soit au début de la ligne, soit précédée d’un caractère n’appartenant pas à un mot. De même elle doit se trouver soit à la fin de la ligne, soit être suivie par un caractère n’appartenant pas à un mot. Les caractères composants les mots sont les lettres, les chiffres et le souligné (‘_’). ([NDT] Bien entendu les minuscules accentuées ne sont pas des lettres ! Elles servent donc à séparer les mots…)-x
: Ne sélectionner que les correspondances qui occupent une ligne entière.
2. Expressions rationnelles
2.1. Définition
Une expression rationnelle est une description d’une chaîne de caractères. Par exemple :
^[[:digit:]]+ -[[:blank:]]+.*$
2.2. Scripts regexp.sh
Le script regexp.sh sera utile pour éprouver les expressions rationnelles.
Il compare une expression rationnelle à des chaînes de caractères et donne le résultat.
#! /bin/sh
# Christophe Blaess, Scripts Shell Linux et Unix, p. 180.
# regexp.sh
EXPRESSION="$1"
# Eliminons l'expression des arguments de ligne de commande :
shift
# Puis comparons-la avec les chaines :
for chaine in "$@"
do
echo "$chaine" | grep "$EXPRESSION" > /dev/null
if [ $? -eq 0 ]
then
echo "$chaine : OUI"
else
echo "$chaine : NON"
fi
done
Par exemple :
./regexp.sh ou Bonjour ou bonsoir
Bonjour : OUI
ou : OUI
bonsoir : NON
./regexp.sh ou Bonjour oU bonsoir
Bonjour : OUI
oU : NON
bonsoir : NON
./regexp.sh o. Bonjour oU bonsoir
Bonjour : OUI
oU : OUI
bonsoir : OUI
2.3. Le symbole générique .
./regexp.sh o.r Bonjour oU bonsoir
Bonjour : OUI
oU : NON
bonsoir : OUI
./regexp.sh o.r Bonjour oU bonsoiiiiiir
Bonjour : OUI
oU : NON
bonsoiiiiiir : NON
./regexp.sh o.r Bonjour oU bonsoor
Bonjour : OUI
oU : NON
bonsoor : OUI
2.4. Début et fin de chaînes
./regexp.sh '^B' Bonjour oU bonsoor
Bonjour : OUI
oU : NON
bonsoor : NON
./regexp.sh 'r$' Bonjour oU bonsoor
Bonjour : OUI
oU : NON
bonsoor : OUI
./regexp.sh '^oU$' Bonjour oU bonsoor
Bonjour : NON
oU : OUI
bonsoor : NON
./regexp.sh '^ou$' Bonjour oU bonsoor
Bonjour : NON
oU : NON
bonsoor : NON
./regexp.sh 'ou.$' Bonjour oU bonsoor
Bonjour : OUI
oU : NON
bonsoor : NON
2.5. Alternatives
./regexp.sh 'ou\|oi' Bonjour ou bonsoir
Bonjour : OUI
ou : OUI
bonsoir : OUI
./regexp.sh 'ou\|oi' Bonjour ou bonsoor
Bonjour : OUI
ou : OUI
bonsoor : NON
./regexp.sh 'ou\|oi\|oo' Bonjour ou bonsoor
Bonjour : OUI
ou : OUI
bonsoor : OUI
2.6. Listes
./regexp.sh '[ji]' Bonjour ou bonsoir
Bonjour : OUI
ou : NON
bonsoir : OUI
./regexp.sh 'n[ji]' Bonjour ou bonsoir
Bonjour : OUI
ou : NON
bonsoir : NON
./regexp.sh 'n[js]' Bonjour ou bonsoir
Bonjour : OUI
ou : NON
bonsoir : OUI
2.7. Intervalles
./regexp.sh 'o[a-z]' Bonjour o5 bonsoir
Bonjour : OUI
o5 : NON
bonsoir : OUI
./regexp.sh '[A-Z]o' Bonjour o5 bonsoir
Bonjour : OUI
o5 : NON
bonsoir : NON
./regexp.sh 'o[0-9]' Bonjour o5 bonsoir
Bonjour : NON
o5 : OUI
bonsoir : NON
2.8. Classes
Les classes sont plus commodes à utiliser que les intervalles. Voici les douze classes standards.
Les classes se notent dans le format [[:classe:]]
Nom | Signification | Ascii | Iso-8859-15 |
---|---|---|---|
alpha | Lettres alphabétiques dans la locali- sation en cours. | [A-Za-z] | [A-Za-zÀÁÂÃÄ... ùúûü ́y] |
digit | Chiffres décimaux. | [0-9] | idem Ascii |
xdigit | Chiffres hexadécimaux. | [0-9A-Fa-f] | idem Ascii |
alnum | Chiffres ou lettres alphabétiques. | [[:alpha:][:digit:]] | [[:alpha:][:digit:]] |
lower | Lettres minuscules dans la localisation en cours. | [a-z] | [a-zàáâãä...ùúûü ́y] |
upper | Lettres majuscules dans la localisation en cours. | [A-Z] | [A-ZÀÁÂÃÄ...ÙÚÛÜY ́] |
blank | Caractères blancs. | espace et tabulation | idem Ascii |
space | Caractères d’espacement. | espace, tabulation, sauts de ligne et de page, retour chariot | idem Ascii |
punct | Signes de ponctuation. | []!"#$%&'()*+,-./:;<=>?@\ ^_{}~[] | idem Ascii |
graph | Symboles ayant une représentation graphique. | [[:alnum:][:punct:]] | [[:alnum:][:punct:]] |
print | Caractères imprimables (graph et l’espace). | [[:graph:]] | [[:graph:]] |
cntrl | Caractères de contrôle. | Codes Ascii inférieurs à 31, et caractère de code 127 | idem Ascii |
Exemple :
./regexp.sh "[[:punct:]]" bonjour bonjour,
bonjour : NON
bonjour, : OUI
2.9. Opérateurs de répétitions
Opérateurs :
-
*
: toute occurence de l’élément précédent même l’absence -
\+
: une ou plusieurs occurence de l’élément précédent -
\?
: zéro ou une occurrence de l’élément précédent -
\{n,m\}
: au moins n et au plus m occurrences de l’élément précédent
Exemples :
- Tout caractère :
./regexp.sh "b.*" b bo bon bonjour Bonjour
b : OUI
bo : OUI
bon : OUI
bonjour : OUI
Bonjour : NON
./regexp.sh "bo*n" bn bon boooooon
bn : OUI
bon : OUI
boooooon : OUI
- Trouver une chaîne composée de mots séparés d’espaces et de tabulations :
^[[:blank:]]*[[:alpha:]][[:alpha:]]*[[:blank:]]*
- Une ou plusieurs occurences :
./regexp.sh "bo\+n" bn bon boooooon
bn : NON
bon : OUI
boooooon : OUI
- Aucune ou une occurence :
./regexp.sh "bo\?n" bn bon boooooon
bn : OUI
bon : OUI
boooooon : NON
- Un minimum d’occurences :
./regexp.sh "bo\{2,\}n" bn bon boooooon
bn : NON
bon : NON
boooooon : OUI
- Un maximum d’occurences :
./regexp.sh "bo\{0,2\}n" bn bon boooooon
bn : OUI
bon : OUI
boooooon : NON
- Exactement un nombre d’occurences :
./regexp.sh "bo\{2\}n" bn bon boooooon
bn : NON
bon : NON
boooooon : NON
2.10. Groupements
\(\)
Un groupement permet de rechercher une chaine précise, et sa répétition, ici au minimum deux fois à la suite :
./regexp.sh "\(bon\)\{2\}" bon bonbon
bon : NON
bonbon : OUI
2.11. Expressions rationnelles étendues
Signification | Symbole pour expression régulière simple | Symbole pour expression regulière étendue |
---|---|---|
Caractère générique | . | . |
Début de ligne | ^ | ^ |
Fin de ligne | $ | $ |
Alternative | \ Tube | Tube sans échappement |
Liste de caractères | [] | [] |
Classe de caractères (dans une liste) | [:classe:] | [:classe:] |
Juxtaposition de caractères (dans une liste) | [.séquence.] | [.séquence.] |
Classe d’équivalence (dans une liste) | [=classe=] | [=classe=] |
Zéro, une ou plusieurs occurrences de l’élément précédent | * | * |
Une ou plusieurs occurrences de l’élément précédent | \+ | + |
Zéro ou une occurrence de l’élément précédent | \? | ? |
Au moins n et au plus m occurrences de l’élément précédent | \{n,m\} | {n,m} |
Au moins n occurrences de l’élément précédent | \{n,\} | {n,} |
Au plus m occurrences de l’élément précédent | \{0,m\} | {0,m} |
Exactement n occurrences de l’élément précédent | \{n\} | {n} |
Regroupement de caractères | \( \) | () |
Référence arrière au n-ième regroupement | \n | \n |
Préfixe d’un caractère spécial pour reprendre sa valeur littérale | \ | \ |
Pour tester les expressions rationnelles étendues, on modifiera le script regexp.sh
en ajoutant l’option -E
à la commande grep
2.12. Exercices grep
Pour extraire l’adresse IPv4 de l’interface eth0
:
ip -4 addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
ip -4 addr show eth0 | grep inet | awk '{ print $2; }' | cut -d "/" -f1
Pour retirer les lignes de commentaires :
grep -v "^#" /etc/ssh/sshd_config
Pour retirer en plus les lignes vides :
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"
Retirer les lignes vides et les commentaires :
grep -v '^$\|^\s*\#' /etc/ssh/sshd_config
On visitera utilement https://stackoverflow.com/search?q=grep .
2.13. Recherches récursives
L’option -R
de la commande grep permet de réaliser une recherche récursive à partir d’un emplacement.
grep -R 'motifachercher' .
Avec find :
find . –type f | xargs grep 'motifachercher'
La recherche de fichier est développée dans le partie Recherche de fichiers
3. Sed
sed
(abréviation de Stream EDitor, « éditeur de flux ») est un programme informatique permettant d’appliquer différentes transformations prédéfinies à un flux séquentiel de données textuelles. sed
lit des données d’entrée ligne par ligne, modifie chaque ligne selon des règles spécifiées dans un langage propre (appelé « script sed »), puis retourne le contenu du fichier (par défaut). Bien qu’originellement écrit pour Unix, par Lee E. McMahon en 1973/1974 (Bell Labs), sed
est maintenant disponible sur pratiquement tous les systèmes d’exploitation disposant d’une interface en ligne de commande.
sed
est souvent décrit comme un éditeur de texte non-interactif. Il diffère d’un éditeur conventionnel en ceci que la séquence de traitement des deux flux d’informations nécessaires (les données et les instructions) est inversée. Au lieu de prendre une par une les commandes d’édition pour les appliquer à l’intégralité du texte (qui doit alors être intégralement en mémoire), sed ne parcourt qu’une seule fois le fichier de texte, en appliquant l’ensemble des commandes d’édition à chaque ligne. Comme une seule ligne à la fois est présente en mémoire, sed peut traiter des fichiers de taille complètement arbitraire.
(source : https://fr.wikipedia.org/wiki/Stream_Editor)
sed
accepte un certain nombre de commandes représentées par une lettre unique. Ce jeu de commandes est basé sur celui de l’éditeur ed
. Les commandes les plus utilisées sont d
, p
et s
.
L’option -e
sort le résultat sur la sortie standard et l’option -i
applique directement les changements sur le fichier.
3.1. Impression et suppression
Les commandes p
et d
permettent d’imprimer ou d’effacer des lignes sur base d’un motif. Ces fonctions peuvent être assurées par d’autres programmes comme tail
, head
, grep
, etc.
La commande p
permet d’imprimer la sélection
sed -e 'p' /etc/hosts.allow
#
#
# hosts.allow This file contains access rules which are used to
# hosts.allow This file contains access rules which are used to
# allow or deny connections to network services that
# allow or deny connections to network services that
# either use the tcp_wrappers library or that have been
# either use the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
# started through a tcp_wrappers-enabled xinetd.
#
#
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
# See 'man tcpd' for information on tcp_wrappers
#
#
Sans l’option -n
la ligne traitée est dupliquée.
sed -n -e 'p' /etc/hosts.allow
#
# hosts.allow This file contains access rules which are used to
# allow or deny connections to network services that
# either use the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
#
Sélectionner une ligne, ici la ligne numéro 4 :
sed -n -e '4p' /etc/hosts.allow
# either use the tcp_wrappers library or that have been
Sélectionner un intervalle de lignes, ici de 4 à 6 :
sed -n -e '4,6p' /etc/hosts.allow
# either use the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
Imprimer les lignes contenant un motif :
sed -n -e '/hosts/p' /etc/hosts.allow
# hosts.allow This file contains access rules which are used to
# See 'man 5 hosts_options' and 'man 5 hosts_access'
Imprimer les lignes qui ne contiennent pas un motif :
sed -n -e '/hosts/!p' /etc/hosts.allow
#
# allow or deny connections to network services that
# either use the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
#
La commande d
permet de supprimer des lignes ici de 1 à 6:
sed -e '1,6d' /etc/hosts.allow
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
#
Supprimer des lignes de commentaire vide :
sed -e '/^#$/d' /etc/hosts.allow
# hosts.allow This file contains access rules which are used to
# allow or deny connections to network services that
# either use the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
3.2. Substitution
C’est la commande s
qui permet la substitution. Utilisée sans autre commande, elle transforme le premier motif rencontré sur chaque ligne :
sed -e 's/man/!!!!!/' /etc/hosts.allow
#
# hosts.allow This file contains access rules which are used to
# allow or deny connections to network services that
# either use the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# See '!!!!! 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See '!!!!! tcpd' for information on tcp_wrappers
#
Ici, on remplace la seconde occurrence trouvée sur chaque ligne :
sed -e 's/man/!!!!!/2' /etc/hosts.allow
#
# hosts.allow This file contains access rules which are used to
# allow or deny connections to network services that
# either use the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# See 'man 5 hosts_options' and '!!!!! 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
#
On ajoute l’option g
pour que chaque occurrence soit remplacée :
sed -e 's/man/!!!!!/g' /etc/hosts.allow
#
# hosts.allow This file contains access rules which are used to
# allow or deny connections to network services that
# either use the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# See '!!!!! 5 hosts_options' and '!!!!! 5 hosts_access'
# for information on rule syntax.
# See '!!!!! tcpd' for information on tcp_wrappers
#
Remplacer un motif trouvé sur la première ligne (1
) :
sed -e '1 s/^.*$/!!!!/' /etc/hosts.allow
On ira visiter utilement https://stackoverflow.com/search?q=sed
3.3. Figures Sed courantes
- Remplacer la ligne numéro x
4. AWK
Source : https://fr.wikipedia.org/wiki/Awk
awk
— dont le nom vient des trois créateurs, Alfred Aho, Peter Weinberger et Brian Kernighan — est un langage de traitement de lignes, disponible sur la plupart des systèmes Unix et sous Windows avec Cygwin ou Gawk. Il est principalement utilisé pour la manipulation de fichiers textuels pour des opérations de recherches, de remplacement et de transformations complexes.
4.1. Présentation
Awk
est le plus souvent utilisé pour la production de fichiers plats aux spécifications particulières (échanges entre différents systèmes d’informations hétérogènes). Il est aussi utilisé comme analyseur (parser) de fichiers XML ou de fichiers textes pour générer des commandes SQL à partir des données extraites. Il peut être utilisé aussi pour des opérations de calculs complexes et mise en forme de données brutes pour faire des tableaux statistiques.
On distingue awk
, la commande originale, du new awk
(nawk
), arrivée un peu plus tard sur le marché. Les implémentations GNU de awk, sont en fait des new awk
. On trouve en général la commande awk dans /usr/bin
sous Unix. Certains systèmes GNU/Linux le mettent dans /bin
. En général, elle est dans la variable d’environnement PATH
. Cependant, on peut faire des scripts en awk et le shebang (#!/usr/bin/awk -f
) devient faux. Le script est donc inutilisable si le binaire n’est pas là où on l’attend.
Il agit comme un filtre programmable prenant une série de lignes en entrée (sous forme de fichiers ou directement via l’entrée standard) et écrivant sur la sortie standard, qui peut être redirigée vers un autre fichier ou programme. Un programme Awk est composé de trois blocs distincts utilisables ou non pour le traitement d’un fichier (prétraitement, traitement, post-traitement). Awk
lit sur l’entrée ligne par ligne, puis sélectionne (ou non) les lignes à traiter par des expressions rationnelles (et éventuellement des numéros de lignes). Une fois la ligne sélectionnée, elle est découpée en champs selon un séparateur d’entrée indiqué dans le programme awk par le symbole FS
(qui par défaut correspond au caractère espace ou tabulation). Puis les différents champs sont disponibles dans des variables : $1
(premier champ), $2
(deuxième champ), $3
(troisième champ), …, $NF
(dernier champ).
“awk” est aussi l’extension de nom de fichier utilisée pour les scripts écrits dans ce langage (rarement utilisée).
La syntaxe est inspirée du C :
awk [options] [programme] [fichier]
où la structure du programme est :
'motif1 { action1 } motif2 { action2 } ...'
Chaque ligne du fichier est comparée successivement aux différents motifs (le plus souvent des expressions rationnelles, et globalement une expression booléenne) et l’action du premier motif renvoyant la valeur vraie est exécutée. Dans ce cas, ou si aucun motif n’est accepté, le programme lit la ligne suivante du fichier et la compare aux motifs en partant du premier.
Quelques options :
-
-F séparateur
: permet de modifier le séparateur de champs ; -
-f fichier
: lit le programme à partir d’un fichier. -
-v awkVar=$shellVar
: Permet de facilement intégrer des variables du shell dans le code awk.
4.2. Description technique
Un fichier est divisé en lignes (records en anglais) elles-mêmes divisées en champs (fields en anglais).
- lignes : séparateur
; compteur `NR`. - champs : séparateur espace ou tabulation ; compteur
NF
.
Les séparateurs d’entrée-sortie sont stockés dans des variables et peuvent être modifiés :
- lignes : variables
RS
etORS
- champs : variables
FS
etOFS
Pour retourner le nième champ :
-
$n
où n est un entier strictement positif ; -
$0
retourne la ligne entière.
Deux masques spéciaux :
-
BEGIN
: définit un programme avant de commencer l’analyse du fichier ; -
END
: définit un programme après l’analyse.
Pour définir un intervalle, on utilise la virgule comme ceci :
-
NR == 1,NR == 10
: l’action associée sera appliquée aux lignes 1 à 10.
Plusieurs fonctions sont déjà implémentées :
-
print
,printf
: fonctions d’affichage ; -
cos(expr)
,sin(expr)
,exp(expr)
,log(expr)
; -
getline()
: lit l’entrée suivante d’une ligne, retourne 0 si fin de fichier (EOF : end of file), 1 sinon ; -
index(s1, s2)
: retourne la position de la chaîne s2 dans s1, retourne 0 si s2 ne figure pas dans s1 ; -
int(expr)
: partie entière d’une expression ; -
length(s)
: longueur de la chaîne s ; -
substr(s,n,l)
: retourne une partie de la chaine de caractères s commençant à la position n, et d’une longueur l.
Structures de contrôles : la syntaxe provient directement du C :
if (test) {actions} else {actions}
while (test) {actions}
do {actions} while (test)
for (expr1;expr2;expr3) {actions}
-
continue
: passe à l’élément suivant dans une boucle -
break
: sort d’une boucle
Par rapport au C il y a quelques extensions :
-
continue
: hors d’une boucle, passe au motif suivant. -
next
: passe à la ligne suivante -
tableau[texte]=valeur
: tableaux assocatifs for (var in tableau) {actions}
4.3. Quelques exemples
En installant la documentation de gawk, on obtient des fichiers d’exemple de données à traiter pour les exemples :
apt update && apt -y install gawk-doc
ls /usr/share/doc/gawk/examples/
Nous allons utiliser les fichiers mail-list
et inventory-shipped
.
cat /usr/share/doc/gawk/examples/data/mail-list
Amelia 555-5553 amelia.zodiacusque@gmail.com F
Anthony 555-3412 anthony.asserturo@hotmail.com A
Becky 555-7685 becky.algebrarum@gmail.com A
Bill 555-1675 bill.drowning@hotmail.com A
Broderick 555-0542 broderick.aliquotiens@yahoo.com R
Camilla 555-2912 camilla.infusarum@skynet.be R
Fabius 555-1234 fabius.undevicesimus@ucb.edu F
Julie 555-6699 julie.perscrutabor@skeeve.com F
Martin 555-6480 martin.codicibus@hotmail.com A
Samuel 555-3430 samuel.lanceolis@shu.edu A
Jean-Paul 555-2127 jeanpaul.campanorum@nyu.edu R
cat /usr/share/doc/gawk/examples/data/inventory-shipped
Jan 13 25 15 115
Feb 15 32 24 226
Mar 15 24 34 228
Apr 31 52 63 420
May 16 34 29 208
Jun 31 42 75 492
Jul 24 34 67 436
Aug 15 34 47 316
Sep 13 55 37 277
Oct 29 54 68 525
Nov 20 87 82 577
Dec 17 35 61 401
Jan 21 36 64 620
Feb 26 58 80 652
Mar 24 75 70 495
Apr 21 70 74 514
- Affiche toutes les lignes de fichier (idem que
cat mail-list
).
cd /usr/share/doc/gawk/examples/data
awk '{print $0}' mail-list
- Affiche toutes les lignes où le caractère 2 est présent (idem que
grep '2' mail-list
).
cd /usr/share/doc/gawk/examples/data
awk '/2/ {print $0}' mail-list
- Affiche toutes les lignes où le caractère “F” est présent dans le quatrième champ.
cd /usr/share/doc/gawk/examples/data
awk '$4~/F/ {print $0}' mail-list
- Affiche le contenu de fichier, mais chaque ligne est précédée de son numéro et du carctère deux-points.
cd /usr/share/doc/gawk/examples/data
awk '{print NR ":", $0}' mail-list
- Renvoie la liste des utilisateurs (idem
cut -d : -f 1 /etc/passwd
).
awk -F: '{print $1}' /etc/passwd
awk 'BEGIN {FS = ":"}{print $1}' /etc/passwd
- Ecrit la somme de tous les nombres de la seconde colonne de fichier.
cd /usr/share/doc/gawk/examples/data
awk '{s=s+$2} END {print s}' inventory-shipped
- Ecrit toutes les lignes contenues dans le fichier entre le motif
Jan
et le motifMar
.
cd /usr/share/doc/gawk/examples/data
awk '/Jan/ , /Mar/' inventory-shipped
- Calcule une moyenne.
cd /usr/share/doc/gawk/examples/data
awk '{ sum = $2 + $3 + $4 + $5 ; avg = sum / 4 ; print $1, avg }' inventory-shipped
- Traitement d’un fichier CSV.
cd /usr/share/doc/gawk/examples/misc
awk -f simple-csv.awk addresses.csv
- Extrait le premier champs d’un fichier csv :
awk -v FPAT="([^,]+)|(\"[^\"]+\")" '{print $1}' addresses.csv
- Différentes manières de préciser le séparateur.
awk -F: '{print $1}' <<< "1:2:3"
awk -v FS=: '{print $1}' <<< "1:2:3"
awk '{print $1}' FS=: <<< "1:2:3"
awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"