1 GPA435 Systèmes dexploitation et programmation de système Copyright, 2000 © Tony Wong, Ph.D. Chapitre 9 Programmation nawk(1)
2 Filtre programmable nawk(1) Les étapes nécessaires pour écrire un programme nawk(1) :Les étapes nécessaires pour écrire un programme nawk(1) : Comprendre le principe de traitement de nawk(1) section 9 à 9.3Comprendre le principe de traitement de nawk(1) section 9 à 9.3 Identifier les patrons légaux de nawk(1) section 9.4Identifier les patrons légaux de nawk(1) section 9.4 Identifier les actions légales de nawk(1) section 9.5Identifier les actions légales de nawk(1) section 9.5 Évidemment, faire les exercices de ce chapitre!Évidemment, faire les exercices de ce chapitre! Système dexploitation UNIX
3 Essentiel des traitements (1) Système dexploitation UNIX La provenance des données dentrée: La provenance des données dentrée: Fichiers spécifiés à la ligne de commande Fichiers spécifiés à la ligne de commande Via un tuyau ou la redirection Via un tuyau ou la redirection Lecture des données est réalisée automatiquement par nawk(1). Lecture des données est réalisée automatiquement par nawk(1). Séparation des lignes dentrée en champs est réalisée par nawk(1) : Séparation des lignes dentrée en champs est réalisée par nawk(1) : FS caractères de séparateur de champ FS caractères de séparateur de champ NF nombre de champs obtenus NF nombre de champs obtenus
4 Essentiel des traitements (2) Système dexploitation UNIX Chaque ligne dentrée est comparée à la séquence « patron - action »: Chaque ligne dentrée est comparée à la séquence « patron - action »: Sil y a correspondance entre la ligne dentrée et un patron, laction correspondante est exécutée. Sil y a correspondance entre la ligne dentrée et un patron, laction correspondante est exécutée. Le paradigme est piloté par données « data- driven ». Le paradigme est piloté par données « data- driven ». La ligne dentrée est comparée à tous les énoncées « patron - action » du programme utilisateur. La ligne dentrée est comparée à tous les énoncées « patron - action » du programme utilisateur.
5 Patrons (1) Six types de patron: Six types de patron: BEGIN BEGIN Laction associée est toujours exécutée avant le traitement des lignes dentrée END END Laction associée est toujours exécutée à la fin des traitements des lignes dentrée expr expr Une expression arithémtique et/ou relationnelle La valeur non nulle ( 0) du résultat de lévaluation de expr provoque lexécution de laction associée Système dexploitation UNIX
6 Patrons (2) Six types de patron (suite): Six types de patron (suite): /regex/ /regex/ Une expression générique. La correspondance entre regex et la ligne dentrée provoque lexécution de laction associée Le symbole ~ représente lopérateur dappariement $0 ~ /^[0-9].*$/ expr_comp expr_comp Expression composée. Le patron est composé plus dun expr (/regex/) reliés par des opérateurs logiques ! Négation, || OU-logique, && ET-logique Système dexploitation UNIX ~ est équivalent à = pour une expression ordinaire
7 Patrons (3) Six types de patron (suite): Six types de patron (suite): expr_interv expr_interv Expression exprimant un intervalle Laction associée est exécutée pour toutes les lignes à lintérieur de l intervalle $1 > 5, $1 5, $1 < 100 Système dexploitation UNIX Ce patron signifie: Les lignes dentrée dont le champ 1 est plus grand que 5 et plus petit que 100. Laction associée à ce patron sera exécutée pour les lignes dentrée satisfaisant cette contrainte.
8 Action Les actions de nawk(1) sont composées: Les actions de nawk(1) sont composées: Instructions légales (voir section 9-5) Instructions légales (voir section 9-5) Fonctions pré-définies (voir section 9-5) Fonctions pré-définies (voir section 9-5) Fonctions utilisateurs Fonctions utilisateurs function nomFunc (liste-parametres) { déclarations} Système dexploitation UNIX Liste-parametres sont des variables passées à la fonction. Elles sont locales à la fonction. Les variables utilisées dans une fonction sont automatiquement des variables globales. Une fonction peut retourner un résultat par linstruction return resultat
9 Programmation nawk(1) Système dexploitation UNIX Comment écrire un programme nawk(1) ? Comment écrire un programme nawk(1) ? Déterminer le but du programme Déterminer le but du programme Comprendre le format des données à traiter Comprendre le format des données à traiter Établir lalgorithme de traitement Établir lalgorithme de traitement Quelles sont les variables et constantes à initialiser dans le programme ? Quelles sont les variables et constantes à initialiser dans le programme ? Les initialiser dans laction du patron BEGIN Quelles sont les tâches à effectuer à la fin du programme ? Quelles sont les tâches à effectuer à la fin du programme ? Les réaliser dans laction du patron END Les réaliser dans laction du patron END
10 Programmation nawk(1) Système dexploitation UNIX Scinder lalgorithme en une séquence de « patron - action » Scinder lalgorithme en une séquence de « patron - action » Chaque énoncée « patron - action » doit réaliser une patrie de lalgorithme Noubliez pas, les lignes dentrée sont comparées à toutes les énoncées « patron - action » Établir les patrons à utiliser: Établir les patrons à utiliser: Doit-on utiliser des expressions relationnelles ? Doit-on utiliser des expressions génériques ? Doit-on utiliser des expressions composées ? Doit-on utiliser des expressions dintervalle ?
11 Programmation nawk(1) Écrire les actions associées: Écrire les actions associées: Vérifier sil existe une fonction pré-définie pour accomplir la tâche Vérifier sil est nécessaire de créer une fonction utilisateur pour simplifier la programmation Vérifier sil est nécessaire de créer une fonction utilisateur pour simplifier la programmation Tester le programme nawk(1) : Tester le programme nawk(1) : Utiliser un petit nombre de données pour tester le programme Tester le programme partie par partie Tester le programme en intégrant toutes les parties ensembles Système dexploitation UNIX
12 Exemples (1) Fréquence des mots dans un texte Fréquence des mots dans un texte Dans le domaine de lanalyse textuelle, la fréquence des mots est un outil très utilisée dans lauthentification des documents. Les gens ont tendance à utiliser souvent les mêmes mots. Nous allons créer un petit programme capable de donner la fréquence dapparition des mots dans un texte Nous allons créer un petit programme capable de donner la fréquence dapparition des mots dans un texte Mots majuscules = Mots minuscules Système dexploitation UNIX
13 Exemples (2) Système dexploitation UNIXOrdinogramme Un tableau associatif est un tableau dans lequel lindice des éléments est une chaîne de caractères. Ex: tab["nom"] = "Tony" Nous utiliserons une expression générique et la fonction gsub() pour accomplir cette tâche Nous utiliserons linstruction print pour réaliser laffichage
14 Exemples (3) Système dexploitation UNIX Isolation des mots par gsub() revient à éliminer les caractères de ponctuation: Isolation des mots par gsub() revient à éliminer les caractères de ponctuation: gusb(/[.,:;!?(){}]/, "") Substitution globale du premier paramètre par le deuxième paramètre de la fonction Premier paramètre: les caractères entre crochets. Donc, reliés par un OU- logique implicit Deuxième paramètre: vide. Donc, substitution par le vide = élimination Note: Chaque mot dune ligne est automatiquement placé dans un champ par nawk(1)
15 Exemples (4) Confondre les mots majuscules et les mots minuscules: Confondre les mots majuscules et les mots minuscules: cat texte.txt | tr 'a-z' 'A-Z' > lignes.tmp Cette conversion est réalisée en dehors du programme nawk(1). Cette conversion est réalisée en dehors du programme nawk(1). On utilise la commande UNIX tr(1) pour effectuer la conversion minuscule - majuscule via un tuyau. On utilise la commande UNIX tr(1) pour effectuer la conversion minuscule - majuscule via un tuyau. Le texte majuscule est placé dans le fichier temporaire lignes.tmp Le texte majuscule est placé dans le fichier temporaire lignes.tmp Système dexploitation UNIX
16 Exemples (5) Compter les mots revient à stocker les mots dans un tableau associatif. Les indices du tableau sont les mots eux-mêmes et la valeur dun élément du tableau est le nombre dapparitions dun mot: Compter les mots revient à stocker les mots dans un tableau associatif. Les indices du tableau sont les mots eux-mêmes et la valeur dun élément du tableau est le nombre dapparitions dun mot: for (i=1; i<=NF; i++) compte[$i]++ Système dexploitation UNIX NF est le nombre de champs de la ligne dentrée. Dans notre contexte, NF est le nombre de mots de la ligne dentrée $i représente le contenu du i e champ. Dans notre contexte, il s agit du i e mot de la ligne. Compte est le tableau associatif. Chaque élément de ce tableau est un mot distinct.
17 Exemples (6) Système dexploitation UNIX A-t-on besoin dinitialiser les variables ou constantes pour ce programme ? A-t-on besoin dinitialiser les variables ou constantes pour ce programme ? Non. Donc pas de patron BEGIN ni son action associée. A-t-on besoin deffectuer des tâches à la fin du programme ? A-t-on besoin deffectuer des tâches à la fin du programme ? Oui. Il faut afficher le nombre dapparitions des mots et le nombre total des mots rencontrés. Cette tâche sera réalisée dans laction associée au patron END.
18 Système dexploitation UNIX#!/bin/sh # comptemot # Programme utilisant nawk(1) pour compter le nombre d'apparitions # des mots dans un texte # D'abord convertir le texte en majuscule et le mettre dans un # fichier temproraire "lignes.tmp" cat texte.txt | tr 'a-z' 'A-Z' > lignes.tmp nawk ' # A la fin du programme afficher le resultat en ordre decroissant # numerique END { for (mot in compte) { print compte[mot], mot | "sort -rn" print compte[mot], mot | "sort -rn" total += compte[mot] total += compte[mot] } print "Nombre total des mots: " total print "Nombre total des mots: " total } { gsub(/[.,:;!?(){}]/,"") # elimine la ponctuation { gsub(/[.,:;!?(){}]/,"") # elimine la ponctuation for (i=1; i<=NF; i++) # placer les mots trouves dans un for (i=1; i<=NF; i++) # placer les mots trouves dans un compte[$i]++ # tableau associatif compte[$i]++ # tableau associatif } ' lignes.tmp
19 Exemples (7) Système dexploitation UNIX Résultat Résultat Je me tutoie Je me tutoie depuis deja longtemps Je me serre, je me sors Je me berce, je me borde et je m'endors Fatigue de moi je reve de toi Je te majuscule Je te point d'exclame Je te vouvoie Mais lorsque je nous trait d'union Ca me reveille Or je me minuscule Je me rendors Point James Corcoran centi 10> comptemot | more 14 JE 9 ME 3 TE 2 TUTOIE 2 POINT 2 DE 1 VOUVOIE 1 TRAIT 1 TOI 1 SORS 1 SERRE 1 REVEILLE 1 REVE : : : 1 BERCE Nombre total des mots: 60
20 Exemples (8) Système dexploitation UNIX Principe de fonctionnement Principe de fonctionnement Le tableau associatif utilise les mots du texte comme indice. Le tableau associatif utilise les mots du texte comme indice. Chaque mot distinct est un élément du tableau associatif. Chaque mot distinct est un élément du tableau associatif. Le contenu du tableau associatif est le nombre d apparitions des mots dans le texte. Le contenu du tableau associatif est le nombre d apparitions des mots dans le texte.
21 Exemples (9) Système dexploitation UNIX Extraire les informations dun en-tête de courriel. Extraire les informations dun en-tête de courriel. Len-tête est placé au préalable dans un fichier temporaire. Len-tête est placé au préalable dans un fichier temporaire. Le programme doit extraire: Le programme doit extraire: Ladresse de la source La date et lheure de réception Le sujet du courriel La longueur du corps du courriel
22 Exemples (10) Système dexploitation UNIX From Fri Mar 17 15:51 EST 2000 X-UIDL: f8d17591aadd380945dc16c5f506b9f7 Received: from gpa.etsmtl.ca (tony [ ]) by exa.gpa.etsmtl.ca (8.9.1a/8.9.1) with ESMTP id PAA04884 for ; Fri, 17 Mar :51: (EST) Message-ID: Message-ID: Date: Fri, 17 Mar :57: From: Tony Wong From: Tony Wong ::: MIME-Version: 1.0 To: Tony Wong To: Tony Wong Subject: TEST 1 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=iso Content-Length: 366 Status: U Ces informations sont à extraire par notre programme. Attention! Le programme nécessite len-tête pré-enregistré dans un fichier. Les Date:, From:, subject: et Content-Length: sont situés dans le premier champ ($1)
23 Système dexploitation UNIXOrdinogramme Ces étapes sont réalisées auto- matiquement par nawk(1).
24 Exemples (11) Système dexploitation UNIX Détecter les mots clés des données recherchées. Détecter les mots clés des données recherchées. Utiliser un patron par mot clé: $1 == "Date:" { actions… } $1 == "From:" { actions… } $1 == "Subject:" { actions… } $1 == "Content-Length:" { actions… }
25 Exemples (12) Système dexploitation UNIX Extraire les informations correspondantes. Extraire les informations correspondantes. Il faut localiser les données à extraireIl faut localiser les données à extraire Utiliser la fonction substr() pour extraire les donnéesUtiliser la fonction substr() pour extraire les données Puisque les 4 informations seront extraites de la même façon, nous créerons une fonction utilisateur nommée extraitinfo()Puisque les 4 informations seront extraites de la même façon, nous créerons une fonction utilisateur nommée extraitinfo()
26 Exemples (13) Système dexploitation UNIX La fonction utilisateur extraitinfo() La fonction utilisateur extraitinfo() function extraitinfo(ligne, motcle) { return substr(ligne, length(motcle) + 2) return substr(ligne, length(motcle) + 2)} ligne contient la ligne dentrée motcle contient le mot clé Date:, From:, Subject:, Content- Length: Extraire la sous-chaîne de ligne à partir de la position length(motcle) + 2. On veut passer par dessous les caractères Espace après le mot clé.
27 Exemples (14) Système dexploitation UNIX A-t-on besoin dinitialiser les variables ou constantes pour ce programme ? A-t-on besoin dinitialiser les variables ou constantes pour ce programme ? Oui. Les mots clés seront placés dans des variables globales. (Patron BEGIN) A-t-on besoin deffectuer des tâches à la fin du programme ? A-t-on besoin deffectuer des tâches à la fin du programme ? Oui. Afficher les données extraites à la sortie standard. (Patron END)
28 Système dexploitation UNIX#!/bin/shFICHIER_ENTETE=entete.tmp cat "$FICHIER_ENTETE" | nawk ' BEGIN { DE = "From:"; DATE = "Date:" SUJET = "Subject:"; LONGUEUR = "Content-Length:" SUJET = "Subject:"; LONGUEUR = "Content-Length:" } END { print "Source-> ", De print "Date de reception-> ", Date print "Date de reception-> ", Date print "Sujet du courriel-> ", Sujet print "Sujet du courriel-> ", Sujet print "Longueur du corps-> ", Longueur print "Longueur du corps-> ", Longueur } $1 == DE { De = extraitinfo($0, DE) } $1 == DATE { Date = extraitinfo($0, DATE) } $1 == SUJET { Sujet = extraitinfo($0, SUJET) } $1 == LONGUEUR { Longueur = extraitinfo($0, LONGUEUR) } function extraitinfo(ligne, motcle) { return substr(ligne, length(motcle) + 2) return substr(ligne, length(motcle) + 2)}' Fonction utilisateur nawk(1). Toujours définir à lintérieur des apostrophes d un programme nawk(1).
29 Exemples (15) Système dexploitation UNIX Résultat Résultat From Fri Mar 17 15:51 EST 2000 X-UIDL: f8d17591aadd380945dc16c5f506b9f7 Received: from gpa.etsmtl.ca (tony [ ]) ::: Date: Fri, 17 Mar :57: From: Tony Wong From: Tony Wong ::: To: Tony Wong To: Tony Wong Subject: TEST 1 ::: Content-Length: 366 Status: U centi 53> enteteinfo Source-> Tony Wong Source-> Tony Wong Date de reception-> Fri, 17 Mar :57: Sujet du courriel-> TEST 1 Longueur du corps-> 366
30 Exemples (16) Système dexploitation UNIX Nous pouvons modifier le programme pour faciliter le traitement. Nous pouvons modifier le programme pour faciliter le traitement. Créer une fonction Bourne shell qui accepte en paramètre le mot clé. Créer une fonction Bourne shell qui accepte en paramètre le mot clé. Cette fonction retournera les données extraites via la sortie standard. Cette fonction retournera les données extraites via la sortie standard. Dans le programme Bourne shell, nous afficherons les données obtenues. Dans le programme Bourne shell, nous afficherons les données obtenues.
31 Système dexploitation UNIX#!/bin/sh # enteteinfo2 FICHIER_ENTETE=entete.tmp extrait () { # # $1 contient le nom du fichier entete # nawk -v MOTCLE="$1" ' nawk -v MOTCLE="$1" ' END { print Info } END { print Info } $1 == MOTCLE { Info = substr($0, length(MOTCLE) + 2) } $1 == MOTCLE { Info = substr($0, length(MOTCLE) + 2) } ' "$FICHIER_ENTETE" ' "$FICHIER_ENTETE"} DATE=`extrait "Date:" | tr ':' '/'` DE=`extrait "From:"` SUJET=`extrait "Subject:"` LONGUEUR=`extrait "Content-Length:"` Fonction Bourne shell Programme nawk(1) Passage de paramètre du Bourne shell vers le programme nawk(1) Les mots clés sont passés à la fonction Bourne shell extrait(). À son tour, elle passe le mot clé reçu au programme nawk(1) via loption -v
32 Système dexploitation UNIX echo "La date de reception> $DATE" echo "La source est> $DE" echo "Le sujet du courriel> $SUJET" echo "La longueur du corps> $LONGUEUR » centi 35> enteteinfo2 La date de reception> Fri, 17 Mar /57/ La source est> Tony Wong La source est> Tony Wong Le sujet du courriel> TEST 1 La longueur du corps> 366 La suite du programme... Résultats obtenus