Le langage awk Awk est un filtre qui facilite le traîtement de texte. awk est p

Le langage awk Awk est un filtre qui facilite le traîtement de texte. awk est programmable et con- tient des constructions pour des instructions conditionnelles, des boucles et des variables, dans une syntaxe similaire au langage C. La commande awk programme fichier1 fichier2 ... execute les instructions awk dans la chaîne programme sur l’entrée provenant des fichiers donnés en argument. La sortie de awk est - généralement - dirigée vers la sortie standard. awk cherche dans chaque ligne d’entrée un sélecteur et s’il s’appli- que, l’action associée est executée. La forme générale d’un programme awk est : BEGIN{ instructions initiales instructions initiales } sélecteur sélecteur { action action } ... END{ instructions finales instructions finales } Il peut y avoir autant de couples sélecteur/action qu’on veut. Après chaque lecture d’une ligne d’entrée, chacun des sélecteurs est évalués (dans l’ordre de leur écriture). Si le sélecteur filtre est vrai, l’action associée est exécutée. S’il n’y a pas de sélecteur, l’action est exécutée pour chaque ligne d’entrée. S’il n’y a pas d’action associée à un sélecteur, la ligne d’entrée est copiée vers la sortie. Une action peut consister de plusieurs instructions séparées par un ;. BEGIN et END indiquent des actions qui ne sont exécutées qu’au début et à la fin du fichier. awk lit chaque ligne d’entrée et la divise en des champs, normalement séparés par un séparateur. Dans une expression awk, $0 représente la ligne d’entrée dans sa totalité et $1, $2, ... représentent le premier, deuxième, etc, champ de cette ligne. Le nombre de champs de la ligne traîtée est disponible dans la variable NF et le nom- bre de lignes lues est disponible dans la variable NR. Le séparateur de champs est accessible à tout instant dans la variable FS, et le séparateur de lignes dans RS. Le séparateur par défaut est le caractère espace ou tabulation, et la valeur par défaut de la variable RS est le caractère newline. Si l’on veut traiter un fichier ou les champs sont sépares par :, comme le fichier /etc/passwd, l’instruction FS=":" Introduction aux Langages Informatiques H. Wertz awk Page 50 doit être dans la section BEGIN. Pour revenir vers le défaut, il suffit d’affecter la chaîne vide à la variable FS. Le nom du fichier actuellement traîté se trouve dans la variable FILENAME. Ci dessous la liste complète des variables awk prédéfinies : variable description valeur par défaut ARGC nombre d’arguments de la commande ARGV tableau des arguments de la commande FILENAM E nom du fichier d’entrée actuel FNR nombre d’enregistrements dans le fichier actuel FS séparateur de champs à la lecture “ ” NF nombre de champs dans l’enregistrement actuel NR nombre d’enregistrements lu OFMT format d’impression de nombres “%.6g” OFS séparateur de champs à l’impression “ ” ORS séparateur d’enregistrements à l’impression “\n” RLENGTHlongueur de la chaîne filtrée par la fonction match RS séparateur d’enregistrement à la lecture “\n” RSTART début de chaîne filtrée par la fonction match SUBSEP séparateur de sousscripts “\034" (”) Tableau 1: variables prédéfinies Ci-dessous quelques exemples simples d’utilisation de awk : awk ‘/srb/’ imprime toutes les lignes du fichier d’entrée contenant la chaîne srb awk ‘END{print NR}’ imprime le nombre de lignes du ficher d’entrée awk ‘{print $3}’ imprime le troisième champ de chaque ligne. et encore un ensemble de commande awk util : NR == 10 imprime la dixième ligne de l’entrée Introduction aux Langages Informatiques Septembre 1995 awk H. Wertz Page 51 {champ = $NF} END { print champ} imprime le dernier champ de la dernière ligne NF > 4 imprime toute ligne à plus de 4 champs $NF > 4 imprime toute ligne dans le dernier champ est supérieur à quatre {nf = nf + NF} END { print nf} imprime le nombre de champs de toutes les lignes d’entrées /Jean/ {nlignes += 1} END { print nlignes} imprime le nombre de lignes contenant le mot ‘Jean’ $1 > max {max = $1; maxligne = $0} END {print max, maxligne} imprime le plus grand premier champ et la ligne qui le contient lenght($0) > 80 imprime toute ligne plus longue que 80 caractères {temp = $1; $1 = $2; $2 = temp; print} imprime chaque ligne en échangeant le premier et le deuxième champ {print NR, $0} imprime chaque ligne précédée par le numéro de ligne {for (i = NF; i > 0; i = i - 1) printf(“%s “, $1) printf(“\n”) } imprime les champs de chaque ligne en ordre inverse Une expression awk peut prendre des valeurs numériques ou des valeurs sous forme de chaînes de caractères. Les opérateurs +, -, *, /, %, ^ et l’opérateur de concate- nation (indiqué par le caractère espace), ainsi que les opérateurs ^, ++, - -, +=, -=, *=, /=, ^= et %= sont disponibles. Les variables peuvent être des scalaires, des éléments de tableaux (notés x[i]) ou des noms de champs tels que $1 ou $2. Les variables sont initialisées à la chaîne vide. Les opérateurs relationnels sont les mê- mes que ceux du langage C (<, <=, ==, !=, >=, >), et ils peuvent être appliqués aussi bien aux nombres qu’aux chaînes de caractères. Par exemple : NF > 5 Septembre 1995 Introduction aux Langages Informatiques H. Wertz awk Page 52 est vraie si les enregistrements ont plus de 5 champs. $1 > “s” est vraie si le premier champs de la ligne analysée est lexicographiquement supérieur à “s”, tel que la chaîne “st”, par exemple. $2 >= 0 est vraie si le deuxième champs est numériquement positif. Il existe également des opérateurs de filtrage explicite. Ce sont les opérateurs “~” et “!~”. Ainsi, l’expression $1 ~ /srb|SRB/ n’est vraie que pour les enregistrements dont le premier champs est égal à srb ou SRB, et l’expression $1 ~/[rR]ue/ est vraie si $1 est égale à rue ou Rue. Comme en ed, la portée d’une action peut être limitée par des adresses séparées par l’opérateur “,”. Par exemple : /début/,/fin/{ ... } applique les opérations entre accolades à la section débutant par la ligne contenant le mot début et se terminant par la ligne contenant le mot fin. Le filtre : NR==10, NR==20 { ... } applique les opérations entre accolades aux lignes 10 à 20 de l’entrée. Le tableau ci-dessous donne la syntaxe des expressions régulières admises en awk : expression description c le caractère normal c \c séquence d’échappement (\b, \f, \n, \r, \t, \ddd) ou caractère litéral c ^ début de chaîne $ fin de chaîne . un caractère quelconque Introduction aux Langages Informatiques Septembre 1995 awk H. Wertz Page 53 [c1c2...cn] tout caractère dans c1, c2, ..., cn [^c1c2...cn] tout caractère différent de c1, c2, ..., cn [c1-c2] tout caractère dans l’interval c1 à c2 [^c1-c2] tout caractère extérieur à l’interval c1 à c2 r1 | r2 toute chaîne filtrée soit par r1 soit par r2 (r1)(r2) toute chaîne xy, où r1 filtre x et r2 filtre y les parenthèses ne sont nécessaires qu’autour des arguments avec alternations (r)* zéro ou plusieurs chaînes consécutives filtrées par r (r)+ une ou plusieurs chaînes consécutives filtrées par r (r)? zéro ou une chaîne filtrée par r (r) toute chaîne filtrée par r Une action de awk se compose d’une ou de plusieurs instructions séparées par des point-virgules ou des line feed. Une instruction peut être une affectation, une ins- truction conditionnelle, une boucle ou l’appel d’une fonction standard telle que print. En générale, la syntaxe de awk est la même que celle du langage C. Ci-dessous la liste des instructions disponibles : if ( condition ) instruction [ else instruction ] while ( condition ) instruction for (expression ; condition ; expression ) instruction for ( variable in tableau ) instruction break continue { [ instruction ] ... } variable = expression print [ liste-d’expressions ] [ >expression ] next # ignore les selecteurs restants de cette ligne d’entrée exit #ignore le reste de l’entrée et continue à l’action END do instruction while (condition) Les instructions se terminent par des point-virgules, des line-feeds ou des accolades droites. Une liste-d’expressions vide represente la ligne d’entrée entière. Par exemple : if ($2 > $1) { x = $1 $1 = $2 $2 = x } Septembre 1995 Introduction aux Langages Informatiques H. Wertz awk Page 54 copie l’entrée standard vers la sortie standard en échangeant le premier et le deuxième champ si le deuxième champs est supérieur au premier. De même qu’en C, les instructions print et printf permettent des arguments pour le formattage des impressions. Par exemple : i = 1 while (i <= NF) { printf “%s, ”, $i i+ + } imprime chaque champs suivi d’une virgule. L’instruction print sans arguments im- prime l’enregistrement courant en entier et, avec des arguments, print peut être utili- sé pour imprimer des champs sélectionnés, comme dans : print $2, $1 qui imprime d’abord le deuxième champs, ensuite le premier, et ensuite un line-feed. Voici un exemple supplémentaire d’utilisation de printf : printf “%s, %s\n”, $1, $2 qui imprime les deux uploads/s3/ se1-cours-awk.pdf

  • 26
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager