Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
doc:systeme:grep [28/08/2011 17:12] darien |
doc:systeme:grep [17/07/2014 14:01] smolski [grep] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ===== GREP : Recherche de caractères dans des fichiers textes ===== | + | ====== grep ====== |
- | Voyez aussi là : | + | |
- | http://www.ac-creteil.fr/reseaux/systemes/linux/shell-scripts/filtres.html] | + | * Objet : filtre grep |
+ | * Niveau requis : {{tag>débutant}} | ||
+ | * Commentaires : //Recherche de caractères dans des fichiers textes.// | ||
+ | * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !]] :-) | ||
+ | * Suivi : | ||
+ | * Création par [[user>smolski]] le 17/01/2009 | ||
+ | * Testé par [[user>smolski]] le 18/10/2012 | ||
+ | * Commentaires sur le forum : [[https://debian-facile.org/viewtopic.php?id=1039 | c'est ici]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) | ||
- | C'est des supers pour expliquer, avec des TP et tout... Merci à toute leur équipe ! | ||
- | Et puis là : | + | ===== Introduction ===== |
- | <note important>Aie ce lien n'existe plus : http://w3.uqo.ca/DOC/unx_grep.html</note> | + | L'acronyme((acronyme : Sigle pouvant être prononcé comme un mot. Eh oui !)) grep vient de la contraction de **Get Regular Expression Print**, //Print// signifiant l'affichage. |
- | Le programme grep explore un ou une série de fichiers d'un ou plusieurs répertoires à la recherche de texte filtrés par une expression régulière donnée (//des lettres, des chiffres//... ). | ||
- | Son nom vient de la contraction Get Regular Expression Print, Print signifiant l'affichage. | + | Le programme grep explore un ou une série de fichiers d'un ou plusieurs répertoires à la recherche de textes filtrés par une expression régulière donnée (//des lettres, des chiffres//... ). |
===== TP01 ===== | ===== TP01 ===== | ||
Ligne 19: | Ligne 23: | ||
Créez un répertoire test1 avec un fichier nommé essai.txt comportant des noms et prénoms avec la commande [[cat]] : | Créez un répertoire test1 avec un fichier nommé essai.txt comportant des noms et prénoms avec la commande [[cat]] : | ||
- | <code bash> | + | <code user>mkdir test1</code> |
- | $ mkdir test1 | + | |
- | $ cat > test1/essai.txt <<EOF</code> | + | Créez le fichier(([[:doc:systeme:touch]])) essai.txt ainsi : |
- | et rédigez : | + | <code user>touch essai.txt</code> |
- | <code>tartempion eric | + | |
+ | Et rédigez(([[:doc:systeme:cat]])) ce fichier **test1/essai.txt** ainsi : | ||
+ | <code user> | ||
+ | cat > test1/essai.txt <<EOF | ||
+ | tartempion eric | ||
greg lucien | greg lucien | ||
howard charles | howard charles | ||
Ligne 29: | Ligne 37: | ||
EOF</code> | EOF</code> | ||
- | Utilisez la commande [[cat]] pour vérifier : | + | Utilisez la commande [[:doc:systeme:cat]] pour en vérifier le contenu : |
- | <code bash>$ cat test1/essai.txt </code> | + | <code user>cat test1/essai.txt</code> |
- | <code>tartempion eric | + | <code> |
+ | tartempion eric | ||
greg lucien | greg lucien | ||
howard charles | howard charles | ||
- | santiago germaine | + | santiago germaine</code> |
- | </code> | + | |
- | Comme précédemment, créons un second répertoire nommé ''test2'' dans lequel nous créons le fichier **adresse.c** contenant les chaînes de caractères ainsi : | + | De la même façon que précédemment, créons un second répertoire nommé ''test2'' dans lequel nous créons le fichier **adresse.c** contenant les chaînes de caractères suivantes : |
- | <code bash> | + | <code user> |
- | $ mkdir test2 | + | cat > test2/adresse.c <<EOF |
- | $ cat > test2/adresse.c <<EOF</code> | + | 25, rue de la source |
- | <code>25, rue de la source | + | |
5bis, avenue linux | 5bis, avenue linux | ||
3358, street gandhi | 3358, street gandhi | ||
Ligne 47: | Ligne 54: | ||
On vérifie les deux fichiers d'un coup ainsi : | On vérifie les deux fichiers d'un coup ainsi : | ||
- | <code bash> | + | <code user>cat ~/test1/essai.txt ~/test2/adresse.c</code> |
- | $ cat ~/test1/essai.txt ~/test2/adresse.c</code> | + | |
<code>tartempion eric | <code>tartempion eric | ||
greg lucien | greg lucien | ||
Ligne 60: | Ligne 66: | ||
<note important>Si l'on omet __le nom de fichier__ à traiter, ''grep'' agit sur le fichier d'entrée (**stdin**). \\ | <note important>Si l'on omet __le nom de fichier__ à traiter, ''grep'' agit sur le fichier d'entrée (**stdin**). \\ | ||
- | Voir commande : [[PWD]] | + | Voir commande : [[:doc:systeme:pwd]] |
</note> | </note> | ||
La commande suivante présente toutes les lignes du fichier essai.txt qui contiennent le caractère "**c**" : | La commande suivante présente toutes les lignes du fichier essai.txt qui contiennent le caractère "**c**" : | ||
- | <code bash>$ grep c ~/test1/essai.txt</code> | + | <code user>grep c ~/test1/essai.txt</code> |
<code>tartempion eric | <code>tartempion eric | ||
greg lucien | greg lucien | ||
Ligne 70: | Ligne 76: | ||
Et celle-là pour la lettre "**u**" : | Et celle-là pour la lettre "**u**" : | ||
- | <code bash>$ grep u ~/test1/essai.txt</code> | + | <code user>grep u ~/test1/essai.txt</code> |
<code>greg lucien</code> | <code>greg lucien</code> | ||
Ligne 76: | Ligne 82: | ||
La commande ''grep'' peut être étendue à tous les fichiers d'un **répertoire**, ou encore à tous les fichiers correspondant à un certain //masque//. | La commande ''grep'' peut être étendue à tous les fichiers d'un **répertoire**, ou encore à tous les fichiers correspondant à un certain //masque//. | ||
- | Dans l'exemple qui suit : ''$ grep a te*/*'', la commande ''grep'' explorera dans le répertoire : | + | Dans l'exemple qui suit : ''grep a te*/*'', la commande ''grep'' explorera dans le répertoire : |
- /home de l'//user// | - /home de l'//user// | ||
- | - à l'interieur des répertoires commençant par "**te**" | + | - à l'intérieur des répertoires commençant par "**te**" |
- tous les types de fichiers dont les chaînes de caractère contiennent la lettre "**a**" | - tous les types de fichiers dont les chaînes de caractère contiennent la lettre "**a**" | ||
- | <code bash>$ grep a ~/te*/*</code> | + | <code user>grep a ~/te*/*</code> |
<code> | <code> | ||
test1/essai.txt:tartempion eric | test1/essai.txt:tartempion eric | ||
Ligne 95: | Ligne 101: | ||
L'option ''-n'' ajoute le numéro de ligne, ainsi : | L'option ''-n'' ajoute le numéro de ligne, ainsi : | ||
- | <code bash> | + | <code user>grep -n a ~/te*/*</code> |
- | $ grep -n a ~/te*/*</code> | + | |
<code> | <code> | ||
test1/essai.txt:2:tartempion eric | test1/essai.txt:2:tartempion eric | ||
Ligne 116: | Ligne 121: | ||
L'option ''-c'' ne donne que le nombre de lignes où la chaîne apparaît __sans afficher ces lignes__. | L'option ''-c'' ne donne que le nombre de lignes où la chaîne apparaît __sans afficher ces lignes__. | ||
- | ==== Expressions régulières ==== | + | ===option -m === |
+ | L'option ''-m N occurrence'' : permet d'arrêter de lire un fichier après avoir trouvé N ligne(s) avec occurrence. | ||
- | Les expressions régulières, ou [[regexp]], peuvent remplacer la chaîne de caractères dans l'argument du programme grep. | + | ==== Expressions rationnelles ==== |
+ | |||
+ | Les expressions rationnelles, ou [[:doc:programmation:shell:regexp]], peuvent remplacer la chaîne de caractères dans l'argument du programme grep. | ||
Voici des exemples : | Voici des exemples : | ||
Ligne 132: | Ligne 140: | ||
**Nota :** | **Nota :** | ||
- | Programme grep avec expressions régulières : | + | Programme grep avec expressions rationnelles : |
Il faut toutefois prendre un soin particulier lorsque l'on utilise les caractères spéciaux : \\ | Il faut toutefois prendre un soin particulier lorsque l'on utilise les caractères spéciaux : \\ | ||
Ligne 138: | Ligne 146: | ||
dans l'expression régulière car ces caractères ont une signification particulière pour le shell. \\ | dans l'expression régulière car ces caractères ont une signification particulière pour le shell. \\ | ||
Il vaut mieux mettre l'expression régulière entre apostrophes simples ou doubles '' '...' ou "..." '' comme ceci par exemple : | Il vaut mieux mettre l'expression régulière entre apostrophes simples ou doubles '' '...' ou "..." '' comme ceci par exemple : | ||
- | <code bash> | + | <code user>grep -n "^t" te*/*</code> |
- | $ grep -n "^t" te*/*</code> | + | |
<code>test1/essai.txt:2:tartempion eric</code> | <code>test1/essai.txt:2:tartempion eric</code> | ||
- | Notez que les champs des lignes produites par ''grep'' (le nom du fichier, le numéro de ligne et la ligne elle-même) sont délimitées par des deux points "**:**", ce qui leur permet d'être traités à postériori par le programme awk dans des **TUBES**. | + | Notez que les champs des lignes produites par ''grep'' (le nom du fichier, le numéro de ligne et la ligne elle-même) sont délimitées par des deux points "**:**", ce qui leur permet d'être traités à postériori par le programme awk dans des [[:doc:programmation:shell:pipe | TUBES]]. |
Pour plus d'information sur la commande grep, lancez : | Pour plus d'information sur la commande grep, lancez : | ||
- | $ man grep. | + | <code user>man grep</code> |