Accueil  / Semaine 4 / Laboratoire d’autoévaluation avec grep

Laboratoire d’autoévaluation avec grep

Installation de grep

L’outil grep est disponible pour pratiquement tous les systèmes d’exploitation. Cependant, si vous avez Windows, alors grep n’est peut-être pas installé sur votre ordinateur. Vous pouvez y avoir accès par l’entremise de Windows System for Linux ou en utilisant Docker, mais ces outils ne font pas partie du présent cours.

Les versions récentes de Windows ont une commande nommée « QGREP » [1] qui pourrait convenir, mais pour vous éviter d’avoir à vérifier votre version de Windows et à avoir à installer des mises à jour, nous vous demandons de télécharger une version plus classique de grep, développée par Tim Charron pour Windows [2].

Le fichier exécutable « grep.exe », contenu dans l’archive zip suivante, devrait être déposé dans votre répertoire « windows » (souvent « c :\windows ») pour les versions de Windows plus ancienne que Windows 7 et dans le répertoire system32 (souvent « c :\windows\system32 ») pour les versions plus récente de Windows [3]. Si vous n’avez pas d’outil capable d’ouvrir une archive zip, comme c’est peut-être le cas si vous avez Windows 98 ou Windows ME, vous pouvez télécharger winzip.

Grep pour windows

Ensuite, pour utiliser grep,
il faut ouvrir une fenêtre de commande. Sous Windows XP, dans le menu « Démarrer », cliquez sur « Exécuter » ;
une fenêtre s’ouvre, tapez le nom de programme « cmd » pour ouvrir une fenêtre de commande.
Notez qu’avec les versions plus anciennes de Windows, comme Windows 98, il faut taper « command.com ».

Une fenêtre s’ouvre alors avec un fond noir, c’est la fenêtre de commande. Vous allez pouvoir y taper des
lignes de commande. Pour saisir votre commande, vous devez appuyer sur la touche « Return ».
Si vous tapez « grep » en ligne de commande, vous devriez voir s’afficher un message vous donnant des instructions très sommaires sur l’utilisation de l’outil. Si Windows ne trouve pas « grep », assurez-vous que le fichier « grep.exe » se trouve bien dans un des répertoires indiqués par la variable d’environnement PATH de windows (tapez « echo %PATH% » pour voir la liste des répertoires en question).

Si vous voyez un message différent, alors vous utilisez un autre programme grep que celui fournit avec ce cours. Dans le doute, ne continuez pas. Les activités d’autoévaluation suivante ne fonctionneront pas. Si vous voulez que les réponses aux activités d’autoévaluation fonctionnent, assurez-vous d’utilisez l’outil grep que nous vous proposons et aucun autre.

Utilisation de la fenêtre de commande

En mode ligne de commande, on change de répertoire avec une commande comme « CD "C :\Mon Dossier" » ; on change de lecteur avec une commande comme « D :». On affiche le contenu du répertoire suivant avec la commande « DIR » et on accède au répertoire parent avec la commande « CD ». On crée un répertoire avec la commande « MKDIR "Mon Répertoire" ».

Pour rediriger la sortie d’une commande vers un fichier, utilisez le symbole « > » qui agit comme caractère de redirection. Ainsi, pour créer un fichier texte « dir.txt » avec le contenu du répertoire courant, faites « DIR > dir.txt ». De la même manière, on peut envoyer le résultat d’une commande grep vers un fichier. On peut ensuite afficher le résultat avec Bloc-notes en tapant « notepad dir.txt ».

Comment utiliser grep (bref rappel)

Grep cherche dans un ou plusieurs fichiers toutes les lignes où se trouve le motif défini par une expression régulière. Ainsi, la commande

grep "citrouille" monfichier.txt

chargera chaque ligne de « monfichier.txt » et tentera d’y trouver l’expression « citrouille ». Seules les lignes où se trouve le mot en question seront affichées. (Voir exemple.) Notez que les guillemets ne sont pas toujours nécessaires, mais en cas de doute, il vaut mieux les insérer.

On peut aussi chercher dans plusieurs fichiers (en format texte) dans le répertoire courant avec la commande

grep "citrouille" *.txt

On peut aussi utiliser des expressions régulières plus sophistiquées : par exemple, l’expression

grep -E "(Citrouille|patate)" *.txt

affichera toutes les lignes contenant soit le mot « citrouille », soit le mot « patate ». Notez la présence du drapeau « -E » qui signifie qu’on utilise des expressions régulières non triviales [4]. On peut sauvegarder le résultat de la recherche dans un nouveau fichier texte comme ceci :

grep -E "(Citrouille|patate)" *.txt > monfichier.txt

Dans la version utilisée de grep , sous Windows, il est possible de chercher dans les sous-répertoires en tapant :

grep -S -E "(Citrouille|patate)" *.txt > monfichier.txt

Dans ce cas, tous les fichiers dans les sous-répertoires du répertoire courant sont utilisés. On obtient le même résultat sous un système d’exploitation de type Unix, comme MacOS ou Linux, avec la commande

grep -r -E "(Citrouille|patate)" > monfichier.txt

ou alors, si on ne veut que les fichiers avec l’extension « txt », on peut obtenir ce résultat en utilisant la commande « find » comme ceci [5] :

find -path "*.txt" | xargs grep -E "(Citrouille|patate)" > monfichier.txt

Questions du laboratoire

Je vous incite fortement à jouer le jeu, c’est-à-dire à répondre aux questions en ne faisant afficher les réponses qu’après avoir fait un effort substantiel pour les trouver. À l’examen, à la fin du cours, on supposera que vous avez fait ce laboratoire et toutes les autres activités d’autoévaluation honnêtement et que vous en maîtrisez donc le contenu.

Les réponses ont été testées avec l’outil grep fournit avec ce cours. Si vous utilisez un autre outil grep que celui exigé par le cours, les solutions ne fonctionneront peut-être pas pour vous.

Question 1

En ligne de commande, accédez au contenu du cédérom Gutenberg en changeant de dossier. Faites « DIR », vous devriez voir le fichier « titles.html ».

A) Trouvez toutes les lignes contenant le mot « Wind » (vent en français) dans le fichier « titles.html ».

B) Vous constaterez sans mal que l’exercice précédent vous donne les titres de documents en code HTML. Supposons maintenant que vous ne vouliez voir s’afficher que les lignes contenant des titres de livres commençant par le mot « Wind » : comment ferez-vous ?

C) Maintenant, affichez toutes les lignes contenant des titres de livres où le mot Voyage apparaît, mais pas au début du titre.

D) Puis, affichez toutes les lignes contenant 3 lettres répétées comme « AAA » ou « eee ». (Indice : utilisez le drapeau « -E », comme dans « grep -E », pour activer les fonctions avancées des expressions régulières.)

Question 2

Grep peut non seulement traiter un fichier, mais aussi plusieurs à la fois !

A) Trouvez toutes les lignes qui contiennent le mot toto, dans tous les fichiers dont l’extension est « txt » sur le cédérom Gutenberg. Que pensez-vous du temps de traitement ? (Indice : sous Windows [6], il faut utiliser le drapeau « -S ».)

B) Trouvez les lignes qui contiennent un lettre répétée 4 fois, comme « AAAA » ou « tttt », dans tous les fichiers dont l’extension est « htm » sur le cédérom Gutenberg. Que pensez-vous du temps de traitement ?

C) Trouvez, dans tous les fichiers dont l’extension est « txt » sur le cédérom Gutenberg, les lignes commençant par « There was a silence ».

Solution :

grep -S -E "^There was a silence" *.txt

D) Trouvez, dans tous les fichiers dont l’extension est « txt » sur le cédérom Gutenberg, les lignes qui contiennent le mot « dog » suivi du mot « cat » avec, au plus, 6 caractères entre les deux.

Solution :
grep -S -E "\<dog\>.{0,6}\<cat\>" *.txt

(Vous devriez trouver des lignes correspondantes dans les fichiers etext00/dscmn10.txt, etext01/grimm10.txt, etext02/91001108.txt, etext02/d1001108.txt, etext02/e1001108.txt, etc.)

Question 3

On peut utiliser les expressions régulières pour créer une base de données. Téléchargez l’archive suivante et extrayez le fichier « html » qu’il contient.

Bottin de professeurs d’histoire de l’UQAM

A) Trouvez toutes les lignes correspondant à un professeur ayant un numéro de poste commençant par « 19 ».

B) Trouvez toutes les lignes contenant l’adresse électronique (uqam.ca) des professeurs ayant un prénom commençant par P.

C) Trouvez toutes les lignes correspondant aux professeurs ayant un numéro de poste commençant par « 192 » ou « 191 ».

D) Trouvez toutes les lignes correspondant aux professeurs ayant un numéro de poste commençant par « 19 », mais pas par « 192 ».

Grep ne sélectionne pas seulement les lignes

La version de Tim Charron de grep pour Windows ne permet de trouver que les lignes complètes, et non pas les motifs que l’on recherche eux-mêmes. La version usuelle de grep, aussi disponible pour Windows, (voir http://unxutils.sourceforge.net/) a un drapeau « -o » qui permet d’obtenir seulement les motifs.

Ainsi, si on fait une recherche dans un bottin et qu’on obtient le résultat suivant :

$ grep Trem bottin.txt
505-837-2938 Guy Tremblay
212-940-2039 Annie Tremblay
301-302-3030 Jo Tremper

on pourra aller chercher les noms seulement comme ceci :

$ grep -o 'Trem[^ ]*' bottin.txt
Tremblay
Tremblay
Tremper

Dans le cadre du laboratoire, la commande suivante aurait pu permettre d’aller chercher seulement les adresses de courriel dans la page web :

grep -o   "[a-zA-Z\.]*@[a-zA-Z\.]*" dhist.html

Malheureusement, il n’existe pas de version de grep pour Windows ayant à la fois les drapeaux « -o » (seulement les motifs) et « -s » (recherche dans les sous-répertoires).

Nous verrons la semaine prochaine qu’il est relativement facile de créer un outil qui ressemble à grep en Java [7] et qui convient à nos besoins.

Question sur le drapeau « -o »

Étant donné le fichier « dhist.html », comment pourrais-je obtenir tous les motifs du type « width="48" » ou « width=44 » en utilisant le drapeau « -o » ?


[1« Findstr » est une autre commande similaire qui supporte les expressions régulières et qui est présente dans toutes les versions de Windows XP, mais elle est moins puissante.

[2Cette version a une fonction supplémentaire très pratique - la recherche dans les sous-répertoires - qu’on peut activer avec le drapeau « -S ». Sous une ligne de commande Unix, on peut obtenir le même résultat en combinant la commande « find » avec la commande « grep » comme ceci : « find -path "*.txt" | xargs grep ... ».

[3L’important, ici, est que le fichier exécutable « grep.exe » soit dans un chemin compris dans votre variable « PATH ».

[4On doit utiliser le drapeau chaque fois qu’on utilise l’un des caractères suivants : ?, +, {, |, ( ou ).

[5La commande Unix « find », ici, n’est pas à confondre avec la commande « find » de Microsoft. Il est possible d’installer le paquetage findutils pour Windows si on désire expérimenter grep avec les commandes « find » et « xargs » décrites ici, mais l’installation et l’utilisation ne sont pas toujours très conviviales.

[6Les utilisateurs de systèmes d’exploitation autres que Windows devront utiliser les commandes « find » et « xargs » décrites précédemment.

[7C’est vrai non seulement pour Java, mais pour la plupart des langages informatiques modernes : la conception d’outils de recherche utilisant les expressions régulières est devenue relativement banale.