Critère de sélection des enregistrements

Présentation de awk Les actions

La commande awk

Présentation

Les expressions régulières

Les expressions relationnelles

Combinaison de critères

Plage d'enregistrement délimitées par des critères

Présentation

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.

Les expressions régulières

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.

Les expressions relationnelles

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  

Combinaison de critères

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  

Plage d'enregistrement délimitées par des critères

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  

Retour haut de la page