Critère de sélection des enregistrements |
![]() |
![]() |
La commande awk |
Les expressions relationnelles
Plage d'enregistrement délimitées par des critères
Un critère peut être une expression régulière, une expression ayant une valeur chaîne de caractères, une expression arithmétique, une combinaison des expressions précédentes.
Le critère est inséré entre les chaînes BEGIN et END, avec la syntaxe suivante:
awk -F":" 'BEGIN{instructions} critères END{instructions}' fichier
BEGIN peut être suivi d'instruction comme une ligne de commentaire ou pour définir le séparateur. Exemple BEGIN { print"Vérification d'un fichier"; FS=":"}. Le texte à afficher peut être un résumé de l'action de awk. De même pour END on peut avoir END{print "travail terminé"} qui indiquera que la commande a achevé son travail. Le END n'est pas obligatoire, de même que le BEGIN.
La syntaxe est la suivante:
/expression régulière/ {instructions} | |
$0 ~ /expression régulière/ {instructions} | les instructions sont exécutées pour chaque ligne contenant une chaîne satisfaisant à l'expression régulière. |
expression ~ /expression régulière/{instructions} | les instructions sont exécutées pour chaque ligne où la valeur chaîne de l'expression contient une chaîne satisfaisant à l'expression régulière. |
expression !~/expression régulière/ {instructions} | les instructions sont exécutées pour chaque ligne où la valeur chaîne de l'expression ne contient pas une chaîne satisfaisant à l'expression régulière. |
Soit le fichier adresse suivant (nom, numéro de téléphone domicile, numéro de portable, numéro quelconque):
gwenael | | | 0298452223 | | | 0638431234 | | | 50 |
marcel | | | 0466442312 | | | 0638453211 | | | 31 |
judith | | | 0154674487 | | | 0645227937 | | | 23 |
L'exemple suivant vérifie que dans le fichier le numéro de téléphone domicile (champ 2) et le numéro de portable (champ 3) sont bien des nombres.
awk 'BEGIN { print "On vérifie les numéros de téléphone; FS="|"} | ||
$2 !~ /^[0-9][0-9]*$/ { print "Erreur sur le numéro de téléphone domicile, ligne n°"NR":\n"$0} | ||
$3 !~ /^[0-9][0-9]*$/ { print "Erreur sur le numéro de téléphone du portable, ligne n°"NR":\n"$0} | ||
END { print "Vérification terminé"} | ||
' adresse |
BEGIN est suivi d'une instruction d'affichage qui résume la fonction de la commande, et de la définition du séparateur de champ. |
L'expression $2 se référe au deuxième champ d'une ligne (enregistrement) de adresse soit le numéro de téléphone domicile, on recherche ceux qui ne contiennent pas de chiffre (négation de contient des chiffres), en cas de succés on affichera un message d'erreur, le numéro de ligne courante, un retour à la ligne, puis le contenu entier de la ligne. |
L'expression $3 se référe au troisième champ d'une ligne (enregistrement) de adresse soit le numéro du portable, on recherche ceux qui ne contiennent pas de chiffre (négation de contient des chiffres), en cas de succés on affichera un message d'erreur, le numéro de ligne courante, un retour à la ligne, puis le contenu entier de la ligne. |
END est suivi d'une instruction d'affichage indiquant la fin du travail. |
Un critère peut contenir des opérateurs de comparaison (- <, <=,==,!=,>=,>). Exemple avec le fichier adresse suivant:
awk 'BEGIN { print "On cherche lignes dont le numéro (champ 4) est supérieur à 30"; FS="|"} | ||
$4 > 30 { print "Numéro supérieur à 30 à la ligne n°"NR":\n"$0} | ||
END { print "Vérification terminé"} | ||
' adresse |
Un critère peut être constitué par une combinaison booléenne avec les opérateurs ou (||), et (&&) et non (!). Exemple:
awk 'BEGIN { print "On cherche la ligne avec judith ou avec un numéro inférieur à 30"; FS="|"} | ||
$1 = = "judith" || $4 < 30 { print "Personne "$1" numéro "$4" ligne n°"NR":\n"$0} | ||
END { print "Vérification terminé"} | ||
' adresse |
La syntaxe est la suivante critère1,critère2 {instructions}. Les instructions sont exécutées pour toute les lignes entre la ligne répondant au critère1 et celle au critère2. L'action est exécutée pour les lignes comprises entre la ligne 2 et 6.
awk 'BEGIN | ||
NR==2;NR==6 { print "ligne n°"NR":\n"$0} | ||
END | ||
' adresse |