1 / 71

Planification du cours #10

Systèmes d’exploitation et programmation de systèmes -GPA435- Cours #10: Filtre programmable gawk(1) – Partie 2 Enseignant: Jean-Philippe Roberge. Planification du cours #10. Revue de l’évaluation informelle Petite révision du cours # 9: Principe de fonctionnement de NAWK

jereni
Download Presentation

Planification du cours #10

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Systèmes d’exploitation et programmation de systèmes-GPA435-Cours #10: Filtre programmable gawk(1) – Partie 2Enseignant: Jean-Philippe Roberge Jean-Philippe Roberge - Juillet 2014

  2. Planification du cours #10 • Revue de l’évaluation informelle • Petite révision du cours #9: • Principe de fonctionnement de NAWK • Exécution des programmables NAWK • Structure d’un programme NAWK • Cours #10: • Activités de traitement • Patrons (revue des possibilités et des expressions régulières) • Actions • Fonctions prédéfinies • Fonctions utilisateurs • Exercices • Visite du laboratoire de commande et de robotique de l’ÉTS (CoRo) Jean-Philippe Roberge - Juillet 2014

  3. Revue de l’évaluation informelle

  4. Résultat du sondage (1) n=21 Jean-Philippe Roberge - Juillet 2014

  5. Résultats du sondage (2) • Quelques-uns des commentaires reçus (cours): • “Plus d’exercices représentatifs de ceux de l’examen**” • “Je trouve que vous présentez rapidement, j’ai eu de la difficulté à suivre le rythme étant donné mon niveau d’apprentissage.” • “Faire une révision plus adéquate pour l’examen final” • “Plus d’exercices disponibles pour se pratiquer à coder” • “Plus d’exemples visuels au tableau du genre entrée-sortie d’une commande” • “Faire plus d’exercices / exemples durant le cours plutôt qu’à la fin (nous sommes moins attentifs à la fin)” • “Plus d’évaluation individuelle formative” Jean-Philippe Roberge - Juillet 2014

  6. Résultats du sondage (3) • Quelques-uns des commentaires reçus (cours): • “Laisser plus de temps pour prendre des notes, même si nous avons accès au contenu présenté, car cela permet de mieux mémoriser la matière” • “Plus d’exercices” • “Il aurait été bien de pouvoir suivre le cours dans un laboratoire au lieu d’un local de cours, afin que l’on puisse tester la matière en suivant le cours” Jean-Philippe Roberge - Juillet 2014

  7. Filtres programmables nawk (1) • Rappel: • Il s’agit d’un programme UNIX capable d’interpréter un programme utilisateur. • Le programme doit être écrit en utilisant les instructions légales et selon le format de nawk(1). • Le concept de programmation est appelé « piloté par données » (data-driven). • nawk(1) est efficace, notamment dans le cadre de: • Validation des concepts de programmation • Automatisation des tâches de gestion • Évaluation rapide des algorithmes • etc. Jean-Philippe Roberge - Juillet 2014

  8. Invocation de nawk (1) Le synopsis de nawk(1): nawk [-F c] [-f prog | 'prog' ] [-v var=valeur…] [fich1 fich2 …] Chaque ligne d’entrée est séparée en champs $0, $1, $2, $3, etc. Ces champs n’ont rien à voir avec les $1, $2, ... de Bourneshell. On peut spécifier un programme nawk(1) dans un fichier par l ’option -f ou l’écrire directement entre apostrophes.

  9. Son principe de fonctionnement: Filtres programmables nawk (1)

  10. Programmation nawk (1) • Nous avions vu un premier exemple où le programme nawk(1) est spécifié directement entre apostrophes:

  11. Programmation nawk (2) • Nous avions vu qu’il était aussi possible de spécifier le programme nawk(1) dans un fichier: • L’option -f est obligatoire. • Il est recommandé d’utiliser un fichier source surtout lorsqu’il comporte beaucoup de lignes. • L’utilisation d’un fichier source facilite la compréhension surtout pour les novices.

  12. Programmation nawk (3) • Utilisation de nawk(1) dans un fichier de commande:

  13. Structure d’un programme (1) • La structure d ’un programme nawk(1) est une séquence de « patron - action »: • Le programme est toujours entouré de ' ' s’il est spécifié dans la ligne de commande. • Il doit exister au moins un caractère blanc (Espace ou Tab) entre le patron et son action. • Les patrons sont évalués dans l’ordre spécifié.

  14. Structure d’un programme (2) • Les déclarations « patron - action » peuvent ne pas contenir de patron OU d’action. • Une déclaration sans patron  l’action correspondante est toujours exécutée peu importe la ligne d’entrée. • Une déclaration sans action  la ligne d’entrée est affichée à la sortie standard (équivalent à print $0) si elle satisfait le critère spécifié par le patron. • On peut considérer un patron comme un filtre d’où l’appellation « filtre programmable »

  15. Structure d’un programme (3) • Un exemple qui démontre cela: Une déclaration sans patron (sans filtre) Une déclaration sans action (activation de l’action par défaut qui est le print $0)

  16. Structure d’un programme (4) • La première accolade est toujours placée sur la même ligne que le patron. • On peut utiliser le point-virgule (;) pour séparer les instructions d’une même ligne. Ces deux styles d’écriture sont équivalents.

  17. Activité de traitement (1) Voici les activités réalisées par nawk(1) lors de l’exécution d’un programme utilisateur. On remarque qu’il y a un ensemble d’opérations effectuées par nawk(1) qui facilitent grandement la programmation.

  18. Pour chaque ligne d’entrée (d’un fichier ou de l’entrée standard), nawk(1) effectue l ’appariement entre les champs de la ligne et chacun des patrons du programme. Donc, ce n’est pas un simple case - esac !!

  19. COURS #10

  20. Filtre programmable nawk(1) • Les étapes nécessaires pour écrire un programme nawk(1): • Comprendre le principe de traitement de nawk(1) section 9 à 9.3 • Identifier les patrons légaux de nawk(1) section 9.4 • Identifier les actions légales de nawk(1) section 9.5 • Faire les exercices de ce chapitre!

  21. Essentiel des traitements (1) • Rappel du dernier cours: • La provenance des données d’entrée: • Fichiers spécifiés à la ligne de commande • Via un tuyau ou la redirection • Lecture des données est réalisée automatiquement par nawk(1). • Séparation des lignes d’entrée en champs est réalisée par nawk(1): • FS  caractères de séparateur de champ • NF  nombre de champs obtenus

  22. Essentiel des traitements (2) • Chaque ligne d’entrée est comparée à la séquence « patron - action »: • S’il y a correspondance entre la ligne d’entrée et un patron, l’action correspondante est exécutée. • Le paradigme est piloté par données « data-driven ». • La ligne d’entrée est comparée à tous les énoncées « patron - action » du programme utilisateur.

  23. Patrons (1) • Six types de patron: • BEGIN • L’action associée est toujours exécutée avant le traitement des lignes d’entrée • END • L’action associée est toujours exécutée à la fin des traitements des lignes d’entrée • expr • Une expression arithémtique et/ou relationnelle • La valeur non nulle ( 0) du résultat de l’évaluation de expr provoque l’exécution de l’action associée

  24. Patrons (2) • Six types de patron (suite): • /regex/ • Une expression générique. La correspondance entre regex et la ligne d’entrée provoque l’exécution de l’action associée. • Le symbole ~ représente l’opérateur d’appariement • $0 ~ /^[0-9].*$/ • expr_comp • Expression composée. Le patron est composé plus d’un expr (/regex/) reliés par des opérateurs logiques • ! Négation, || OU-logique, && ET-logique ~ est équivalent à = pour une expression ordinaire

  25. Patrons (3) • Six types de patron (suite): • expr_interv • Expression exprimant un intervalle • L’action associée est exécutée pour toutes les lignes à l’intérieur de l ’intervalle • $1 > 5, $1 < 100 Ce patron signifie: Les lignes d’entrée dont le champ 1 est plus grand que 5 et plus petit que 100. L’action associée à ce patron sera exécutée pour les lignes d’entrée satisfaisant cette contrainte.

  26. Action (1) • Les actions de nawk(1) sont composées: • Instructions légales (voir section 9-5) • Fonctions pré-définies (voir section 9-5) • Fonctions utilisateurs: • functionnomFunc (liste-parametres) { • déclarations • } 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 l’instruction return resultat

  27. Programmation nawk(1) • Comment écrire un programme nawk(1) ? • Déterminer le but du programme • Comprendre le format des données à traiter • Établir l’algorithme de traitement • Quelles sont les variables et constantes à initialiser dans le programme ? • Les initialiser dans l’action du patron BEGIN • Quelles sont les tâches à effectuer à la fin du programme ? • Les réaliser dans l’action du patron END

  28. Programmation nawk(1) • 1) Scinder l’algorithme en une séquence de « patron - action » • 2) Chaque énoncée « patron - action » doit réaliser une patrie de l’algorithme • 3) N’oubliez pas, les lignes d’entrée sont comparées à toutes les énoncées « patron - action » • 4) É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 d’intervalle ?

  29. Programmation nawk(1) • Écrire les actions associées: • Vérifier s’il existe une fonction pré-définie pour accomplir la tâche • Vérifier s’il est nécessaire de créer une fonction utilisateur pour simplifier la programmation • 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

  30. Exemples (1) • Fréquence des mots dans un texte… • Dans le domaine de l’analyse textuelle, la fréquence des mots est un outil très utilisée dans l’authentification 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 d’apparition des mots dans un texte • Mots majuscules = Mots minuscules

  31. Exemples (2) Ordinogramme Nous utiliserons une expression générique et la fonction gsub() pour accomplir cette tâche Un tableau associatif est un tableau dans lequel l’indice des éléments est une chaîne de caractères. Ex: tab["nom"] = "Tony" Nous utiliserons l’instruction print pour réaliser l’affichage

  32. Exemples (3) • Isolation des mots par gsub() revient à éliminer les caractères de ponctuation: • gsub(/[.,:;!?(){}]/, "") 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 Substitution globale du premier paramètre par le deuxième paramètre de la fonction Note: Chaque mot d’une ligne est automatiquement placé dans un champ par nawk(1)

  33. Exemples (4) • 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). • 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

  34. 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 d’un élément du tableau est le nombre d’apparitions d’un mot: • for (i=1; i<=NF; i++) • compte[$i]++ NF est le nombre de champs de la ligne d’entrée. Dans notre contexte, NF est le nombre de mots de la ligne d’entrée $i représente le contenu du ie champ. Dans notre contexte, il s ’agit du ie mot de la ligne. Compte est le tableau associatif. Chaque élément de ce tableau est un mot distinct.

  35. Exemples (6) • A-t-on besoin d’initialiser les variables ou constantes pour ce programme ? • Non. Donc pas de patron BEGIN ni son action associée. • A-t-on besoin d’effectuer des tâches à la fin du programme ? • Oui. Il faut afficher le nombre d’apparitions des mots et le nombre total des mots rencontrés. Cette tâche sera réalisée dans l’action associée au patron END.

  36. #!/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" total += compte[mot] } print "Nombre total des mots: " total } { gsub(/[.,:;!?(){}]/,"") # elimine la ponctuation for (i=1; i<=NF; i++) # placer les mots trouves dans un compte[$i]++ # tableau associatif } ' lignes.tmp

  37. Exemples (7) • Résultat: 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 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

  38. Exemples (8) Principe de fonctionnement: Le tableau associatif utilise les mots du texte comme indice. 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.

  39. Exemples (9) • Extraire les informations d’un en-tête de courriel. • L’en-tête est placé au préalable dans un fichier temporaire. • Le programme doit extraire: • L’adresse de la source • La date et l’heure de réception • Le sujet du courriel • La longueur du corps du courriel

  40. Exemples (10) From wong@exa.gpa.etsmtl.ca Fri Mar 17 15:51 EST 2000 X-UIDL: f8d17591aadd380945dc16c5f506b9f7 Received: from gpa.etsmtl.ca (tony [142.137.41.54]) by exa.gpa.etsmtl.ca (8.9.1a/8.9.1) with ESMTP id PAA04884 for <wong@gpa.etsmtl.ca>; Fri, 17 Mar 2000 15:51:43 -0500 (EST) Message-ID: <38D29C38.DD2271C9@gpa.etsmtl.ca> Date: Fri, 17 Mar 2000 15:57:28 -0500 From: Tony Wong <wong@gpa.etsmtl.ca> : : : MIME-Version: 1.0 To: Tony Wong <wong@exa.gpa.etsmtl.ca> Subject: TEST 1 Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=iso-8859-1 Content-Length: 366 Status: U Ces informations sont à extraire par notre programme. Attention! Le programme nécessite l’en-tête pré-enregistré dans un fichier. Les Date:, From:, subject: et Content-Length: sont situés dans le premier champ ($1)

  41. Ordinogramme Ces étapes sont réalisées auto-matiquement par nawk(1).

  42. Exemples (11) • 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… }

  43. Exemples (12) • Extraire les informations correspondantes. • Il faut localiser les données à extraire • Utiliser 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()

  44. Exemples (13) • La fonction utilisateur extraitinfo(): functionextraitinfo(ligne, motcle) { return substr(ligne, length(motcle) + 2) } ligne contient la ligne d’entré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é.

  45. Exemples (14) • A-t-on besoin d’initialiser 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 d’effectuer des tâches à la fin du programme ? • Oui. Afficher les données extraites à la sortie standard. (Patron END)

  46. #!/bin/sh FICHIER_ENTETE=entete.tmp cat "$FICHIER_ENTETE" | nawk ' BEGIN { DE = "From:"; DATE = "Date:" SUJET = "Subject:"; LONGUEUR = "Content-Length:" } END { print "Source-> ", De print "Date de reception-> ", Date print "Sujet du courriel-> ", Sujet 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) } ' Fonction utilisateur nawk(1). Toujours définir à l’intérieur des apostrophes d ’un programme nawk(1).

  47. Exemples (15) • Résultat: From wong@exa.gpa.etsmtl.ca Fri Mar 17 15:51 EST 2000 X-UIDL: f8d17591aadd380945dc16c5f506b9f7 Received: from gpa.etsmtl.ca (tony [142.137.41.54]) : : : : : : Date:Fri, 17 Mar 2000 15:57:28 -0500 From: Tony Wong <wong@gpa.etsmtl.ca> : : : : : : To: Tony Wong <wong@exa.gpa.etsmtl.ca> Subject: TEST 1 : : : : : : Content-Length: 366 Status: U centi 53> enteteinfo Source-> Tony Wong <wong@gpa.etsmtl.ca> Date de reception-> Fri, 17 Mar 2000 15:57:28 -0500 Sujet du courriel-> TEST 1 Longueur du corps-> 366

  48. Exemples (16) • Nous pouvons modifier le programme pour faciliter le traitement. • Créer une fonction Bourneshell qui accepte en paramètre le mot clé. • Cette fonction retournera les données extraites via la sortie standard. • Dans le programme Bourneshell, nous afficherons les données obtenues.

  49. #!/bin/sh # enteteinfo2 FICHIER_ENTETE=entete.tmp extrait () { # # $1 contient le nom du fichier entete # nawk -v MOTCLE="$1" ' END { print Info } $1 == MOTCLE { Info = substr($0, length(MOTCLE) + 2) } ' "$FICHIER_ENTETE" } DATE=`extrait "Date:" | tr ':' '/'` DE=`extrait "From:"` SUJET=`extrait "Subject:"` LONGUEUR=`extrait "Content-Length:"` Passage de paramètre du Bourneshell vers le programme nawk(1) Fonction Bourne shell Programme nawk(1) Les mots clés sont passés à la fonction Bourneshellextrait(). À son tour, elle passe le mot clé reçu au programme nawk(1) via l’option -v

  50. La suite et fin du programme ... echo "La date de reception> $DATE" echo "La source est> $DE" echo "Le sujet du courriel> $SUJET" echo "La longueur du corps> $LONGUEUR » Résultats obtenus centi 35> enteteinfo2 La date de reception> Fri, 17 Mar 2000 15/57/28 -0500 La source est> Tony Wong <wong@gpa.etsmtl.ca> Le sujet du courriel> TEST 1 La longueur du corps> 366

More Related