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

Transcription

La recherche de chaînes de caractères avec le filtre grep
La recherche de chaînes de caractères avec le filtre grep
Écrit par lingunix
Dimanche, 24 Octobre 2010 21:17 - Mis à jour Jeudi, 31 Mars 2011 10:26
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
1 / 12
La recherche de chaînes de caractères avec le filtre grep
Écrit par lingunix
Dimanche, 24 Octobre 2010 21:17 - Mis à jour Jeudi, 31 Mars 2011 10:26
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 :
2 / 12
La recherche de chaînes de caractères avec le filtre grep
Écrit par lingunix
Dimanche, 24 Octobre 2010 21:17 - Mis à jour Jeudi, 31 Mars 2011 10:26
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
-v
- Renvoyer toutes les lignes sauf celles qui contiennent une chaîne de caractère donnée :
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 :
3 / 12
La recherche de chaînes de caractères avec le filtre grep
Écrit par lingunix
Dimanche, 24 Octobre 2010 21:17 - Mis à jour Jeudi, 31 Mars 2011 10:26
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 « o
nde
» est présente dans la chaîne « m
onde
» et « r
onde
»...
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.
4 / 12
La recherche de chaînes de caractères avec le filtre grep
Écrit par lingunix
Dimanche, 24 Octobre 2010 21:17 - Mis à jour Jeudi, 31 Mars 2011 10:26
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.
5 / 12
La recherche de chaînes de caractères avec le filtre grep
Écrit par lingunix
Dimanche, 24 Octobre 2010 21:17 - Mis à jour Jeudi, 31 Mars 2011 10:26
- 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 !
6 / 12
La recherche de chaînes de caractères avec le filtre grep
Écrit par lingunix
Dimanche, 24 Octobre 2010 21:17 - Mis à jour Jeudi, 31 Mars 2011 10:26
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
.
7 / 12
La recherche de chaînes de caractères avec le filtre grep
Écrit par lingunix
Dimanche, 24 Octobre 2010 21:17 - Mis à jour Jeudi, 31 Mars 2011 10:26
- 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é
8 / 12
La recherche de chaînes de caractères avec le filtre grep
Écrit par lingunix
Dimanche, 24 Octobre 2010 21:17 - Mis à jour Jeudi, 31 Mars 2011 10:26
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 :
9 / 12
La recherche de chaînes de caractères avec le filtre grep
Écrit par lingunix
Dimanche, 24 Octobre 2010 21:17 - Mis à jour Jeudi, 31 Mars 2011 10:26
- 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 se
d
)
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 = gre
p ^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
10 / 12
La recherche de chaînes de caractères avec le filtre grep
Écrit par lingunix
Dimanche, 24 Octobre 2010 21:17 - Mis à jour Jeudi, 31 Mars 2011 10:26
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-dictionnaire
11 / 12
La recherche de chaînes de caractères avec le filtre grep
Écrit par lingunix
Dimanche, 24 Octobre 2010 21:17 - Mis à jour Jeudi, 31 Mars 2011 10:26
s-banques-bibliotheques
12 / 12

Documents pareils