Lingunix

Les outils unix appliqués à la recherche linguistique et psycholinguistique

  • Augmenter la taille
  • Taille par défaut
  • Diminuer la taille
Les filtres Unix

La recherche de chaînes de caractères avec le filtre grep

Imprimer PDF

La commande grep est une des plus importantes pour nous. Vous constaterez sa présence dans la quasi totalité de mes scripts. C'est avec cet outil que nous allons mettre dans un flux les données d'un fichier texte les résultat de nos script avant de les rediriger dans un fichier texte.

  • Le filtre grep permet de trouver toutes les lignes d'un fichier texte dans lesquelles se trouve une chaîne de caractère recherchée.

Exemple :

Nous cherchons toutes les lignes dans lesquelles se trouve le mot renard dans le livre 1 des fables de la Fontaine au format .txt (la_fontaine_fables_livre1_oudry.txt) :

script :

grep renard la_fontaine_fables_livre1_oudry.txt

résultat :
...
Le renard s’en saisit et dit : « Mon bon Monsieur
...

Toutes les lignes contenant le mot renard serons renvoyées.

La commande grep possède de nombreuses options permettant d'affiner notre résultat dont voici les principales :

  • Ne pas tenir compte de la casse de la chaîne de caractère cherchée : -i

script :

grep -i renard la_fontaine_fables_livre1_oudry.txt

résultat :

Le Corbeau et le Renard ......................................................12
...
Le renard s’en saisit et dit : « Mon bon Monsieur
...

  • Renvoyer le contexte, c'est à dire la ligne avant, après ou les deux : -B1 -A1 -C1

script :

grep -A1 renard la_fontaine_fables_livre1_oudry.txt

résultat :

...
Le renard s’en saisit et dit : « Mon bon Monsieur
Apprenez que tout flatteur
...

Ici on pourrait écrire grep -A2 pour avoir les deux lignes suivantes, ou -A3 pour les troisièmes, etc... et idem pour l'option -B et -C.
Petite info au sujet de ces trois options : -A pour after, -B pour before et -C pour context.

script :

grep -C2 renard la_fontaine_fables_livre1_oudry.txt

résultat :

Et pour montrer sa belle voix
Il ouvre un large bec laisse tomber sa proie.
Le renard s’en saisit et dit : « Mon bon Monsieur
Apprenez que tout flatteur
Vit aux dépens de celui qui l’écoute

 

  • Renvoyer toutes les lignes sauf celles qui contiennent une chaîne de caractère donnée : -v


script :

grep -v cochonnerie commentaires_publiques.txt

résultat :

Toutes les lignes sauf celles qui contiennent la chaîne de caractère "cochonnerie" serons envoyées dans le flux.

 

  • Compter le nombre de lignes dans lesquelles se trouve une chaîne de caractères cherchée : -c


script :

grep -c renard la_fontaine_fables_livre1_oudry.txt

résultat :

13

 

  • Rechercher une expression exact : -w


Il est nécessaire de préciser que grep cherche la présence d'une chaîne de caractère qui elle même peut être présente dans une chaîne de caractère plus grande. Par exemple la chaîne « onde » est présente dans la chaîne « monde » et « ronde »...
Pour récupérer une chaîne de caractère exact nous utiliserons l'option w (word) :

script :

grep -w onde la_fontaine_fables_livre1_oudry.txt

résultat :

Dans le courant d’une onde pure.


L'option, -o de grep va faire écrire dans une colonne, autant de fois que la chaîne de caractère cherchée à été trouvée dans le texte. Nous verrons comment l'utiliser plus tard.

Ces options de grep sont les principales et nous donnent une bonne idée de ce qu'on peut faire avec ce filtre.  Maintenant, voyons ce qu'on peut faire avec cette commande poussée dans un niveaux un peu plus avancé :



La commande grep dans tous ses états :

Chercher plusieurs chaînes de caractères dans un texte :

script :

grep '\(renard\|corbeau\)' la_fontaine_fables_livre1_oudry.txt

résultat :

Toutes les lignes contenant la chaîne renard ou corbeau dans le texte la Fontaine seront envoyées dans le flux (donc sélectionnées). Vous pouvez ainsi mettre autant de mots que vous le souhaitez de cette manière dans grep.

Note : nous pouvons aisément ajouter toutes les options précédemment abordées à ce script, l'une n'empêche pas l'autre.

Remarques  :

 

  • Le petit bâtonnet (pipe) | mit entre les chaînes renard et corbeau fonctionne ici comme un OU logique.
  • Les backslash \ sont utilisés ici pour annuler la valeur des caractères spéciaux ( ) et | pour des raisons que nous aborderons plus tard.
  • Le caractère simple quote ' est utilisé ici pour délimiter un espace dans lequel nous faisons usage de caractères spéciaux.

 

Chercher une expression exact dans un texte :

script :

grep Maître\ renard la_fontaine_fables_livre1_oudry.txt

résultat :

Maître renard par l’odeur alléché


Seules les lignes contenant l'expression exact "Maître renard" sont acceptées, celles contenant maître ou renard ne sont pas retenues.

Remarques :

 

J'aurais due délimiter la chaîne Maître\ renard par des simple quotes, mais je ne l'ai pas fait par pure fainéantise, le résultat de ces deux variables étant les mêmes! Vous saurez désormais, que la fainéantise est une qualité requise chez l'informaticien qui cherchera toujours à systématiser le travail qu'il doit réaliser, dans l'unique but d'en faire le moins possible !

Chercher une chaîne de caractères qui commence par une ou un groupe de lettres en particulier :

Nous débutons enfin à traiter d'un sujet qui commence à avoir un rapport avec la recherche linguiste et psycholinguistique, notamment en ce qui concerne la création de bases de données de chaînes de caractères possédant certaines caractéristiques. De nombreuses recherches étudient par exemple, la manière nous traitons le début ou la fin d'un mot en situation de lecture.

Pour sélectionner une chaîne de caractère qui commence par une ou un groupe de lettres en particulier avec le filtre grep, nous utiliserons le caractère ^ (qui symbolise le début de ligne) .

script :

grep ^re la_fontaine_fables_livre1_oudry.txt

résultat :

recommandable ; ce sont qualités au-dessus de ma portée.
reconnaîtra dans cet auteur le vrai caractère et le vrai génie de
rendais nouvelles par quelques traits qui en relevassent le goût.
recommande aux nourrices de les leur apprendre ; car on ne
représentent confirme les personnes d’âge avancé dans les

Remarques importantes :

 

Comme je vous l'ai expliqué plus haut, la commande grep filtre les lignes qui contiennent une chaîne de caractères cherchée. Le résultat de ce script nous a renvoyé toutes les lignes qui commencent par le groupe de lettre re.

  • Pour obtenir l'ensemble des mots qui commence par le groupe de lettres re, nous seront obligés de faire appel à un autre outil : l'éditeur sed (que nous verrons plus tard).
  • Comme je vous l'ai promis, dans la « Présentation des outils Unix », le niveau de difficulté est croissant.
  • Je vais implémenter ici un « sous-script » avec sed qui va nous permettre d'obtenir l'ensemble des mots qui commence par le groupe de lettres re. La méthode est simple. Il suffit de remplacer tous les espaces entre les mots par un retour chariot. La conséquence de cette astuce est que chaque mot de chaque phrase sera écrits sur une ligne. Nous pourrons ensuite filtrer chaque ligne (dans laquelle ne se trouve qu'un seul mot)  qui commence par le groupe de lettres re.

Cette astuce fait partie des grands classiques des Unixiens chargés du traitement de l'information écrite.

Le script qui remplace chaque espace par un retour chariot :

 

script :

sed -e 's/\ /\n/g'

résultat :

Maître
corbeau,
sur
un
arbre
perché

Script final qui filtre tous les mots d'un texte qui commence par re :

script :

grep . la_fontaine_fables_livre1_oudry.txt |  sed -e 's/\ /\n/g | grep ^re

résultat :

recueil.
relâchât
remit
rend
reste
rendent
recommandable
reconnaîtra
rendais
relevassent
recommandable
rencontre
...

Remarques très importantes :

Il y a deux choses dont j'aurais due vous parler avant, mais je ne voulais pas vous embrouiller :

  • La première, le caractère . (le point) est un caractère générique pour grep qui symbolise tous les caractères.
  • La deuxième, le caractère | (le pipe) permet de rediriger le résultat d'un script dans un autre script.


Explications :

  • Les script « grep . la_fontaine_fables_livre1_oudry.txt » va mettre toutes les lignes du texte étudié dans un flux de données.
  • Le pipe ( | )va prendre ces données et les rediriger dans le script suivant ( sed -e 's/\ /\n/g) qui remplace tous les espaces par des retours chariots.
  • Le deuxième pipe ( | ) va rediriger ce nouveau flux de mots (alignés verticalement par sed) et l'envoyer dans le dernier script qui ne retient que les mots qui commencent par le groupe de lettres re.

 

Analogie de cet algorithme :

  • De nombreuses voitures roulent sur l'autoroute (le flux de mot = grep . ).
  • Les douanes à hauteur d'un péage (le pipe = | ) alignent toutes les voitures sur une voies ( remplacent les espaces par des retour chariots = sed -e 's/\ /\n/g') pour pouvoir les contrôler,
  • Elles interceptent uniquement les voitures rouges (les mots qui commencent par re = grep ^re) .

 

Chercher une chaîne de caractères qui commence par une ou un groupe de lettres en particulier :


Pour sélectionner une chaîne de caractère qui se termine par une ou un groupe de lettres en particulier avec le filtre grep, nous utiliserons le caractère $ (qui symbolise la fin de ligne). Par exemple, pour récupérer les chaînes de caractères qui se terminent par er nous utiliserons le script suivant :

script :

grep er$ la_fontaine_fables_livre1_oudry.txt

Remarques :

Nous ferons face exactement aux mêmes problèmes que précédemment, que nous résoudrons de la même manière :

script final :

grep . la_fontaine_fables_livre1_oudry.txt |  sed -e 's/\ /\n/g | grep er$

résultat :

appeler
marcher
habiller
m’empêcher
dernier
s’appliquer
attacher
envoyer
exiger
juger
considérer
porter
donner

Conclusions :

Le filtre grep est un trés bon outil de filtrage, donc de recherche de chaînes de caractères. Vous savez maintenant transformer votre ordinateur en moteur de recherche interne ! Vous êtes aussi aptes à comprendre ces scripts : http://www.lingunix.org/scripts-linguistiques-dictionnaires-banques-bibliotheques

Mise à jour le Jeudi, 31 Mars 2011 10:26