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 [22/09/2013 23:31] 127.0.0.1 modification externe |
doc:systeme:grep [06/09/2020 11:25] smolski [Lien vers le forum] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== grep ====== | ====== grep ====== | ||
- | (//testé// - **smolski** 18/10/2012) Le retour sur le forum est ici : | ||
- | * [[http://debian-facile.org/viewtopic.php?id=1039 | Lien vers le forum concernant ce tuto]] N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs ! | ||
* Objet : filtre grep | * Objet : filtre grep | ||
- | * Niveau requis : DÉBUTANT | + | * Niveau requis : {{tag>débutant avisé}} |
- | * Commentaires : // Recherche de caractères dans des fichiers textes. // | + | * Commentaires : //Recherche de caractères dans des fichiers textes.// |
- | * Débutant, à savoir : | + | * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !]] :-) |
- | [[: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 !)) | ||
- | Voyez aussi là : | ||
- | * [[http://www.ac-creteil.fr/reseaux/systemes/linux/shell-scripts/filtres.html | ac-creteil Filtres]] | ||
- | |||
- | C'est des supers pour expliquer, avec des TP et tout... Merci à toute leur équipe ! | ||
- | |||
- | 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//... ). | ||
===== Introduction ===== | ===== Introduction ===== | ||
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. | 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 textes filtrés par une expression régulière donnée (//des lettres, des chiffres//... ). | ||
===== TP01 ===== | ===== TP01 ===== | ||
Ligne 25: | 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</code> | + | |
Créez le fichier(([[:doc:systeme:touch]])) essai.txt ainsi : | Créez le fichier(([[:doc:systeme:touch]])) essai.txt ainsi : | ||
- | <code bash> | + | <code user>touch essai.txt</code> |
- | touch essai.txt</code> | + | |
Et rédigez(([[:doc:systeme:cat]])) ce fichier **test1/essai.txt** ainsi : | Et rédigez(([[:doc:systeme:cat]])) ce fichier **test1/essai.txt** ainsi : | ||
- | <code bash> | + | <code user> |
cat > test1/essai.txt <<EOF | cat > test1/essai.txt <<EOF | ||
- | |||
tartempion eric | tartempion eric | ||
greg lucien | greg lucien | ||
Ligne 43: | Ligne 38: | ||
Utilisez la commande [[:doc:systeme:cat]] pour en vérifier le contenu : | Utilisez la commande [[:doc:systeme:cat]] pour en vérifier le contenu : | ||
- | <code bash>cat test1/essai.txt | + | <code user>cat test1/essai.txt</code> |
+ | <file config retour de la commande> | ||
tartempion eric | tartempion eric | ||
greg lucien | greg lucien | ||
howard charles | howard charles | ||
- | santiago germaine</code> | + | santiago germaine</file> |
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 : | 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> |
cat > test2/adresse.c <<EOF | cat > test2/adresse.c <<EOF | ||
25, rue de la source | 25, rue de la source | ||
Ligne 59: | 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> | + | <file config retour de la commande>tartempion eric |
- | <code>tartempion eric | + | |
greg lucien | greg lucien | ||
howard charles | howard charles | ||
Ligne 67: | Ligne 61: | ||
25, rue de la source | 25, rue de la source | ||
5bis, avenue linux | 5bis, avenue linux | ||
- | 3358, street gandhi</code> | + | 3358, street gandhi</file> |
===== Exemples Pratiques ===== | ===== Exemples Pratiques ===== | ||
Ligne 76: | Ligne 70: | ||
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 | + | <file config retour de la commande>tartempion eric |
greg lucien | greg lucien | ||
- | howard charles</code> | + | howard charles</file> |
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> | + | <file config retour de la commande>greg lucien</file> |
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> | + | <file config retour de la commande> |
test1/essai.txt:tartempion eric | test1/essai.txt:tartempion eric | ||
test1/essai.txt:howard charles | test1/essai.txt:howard charles | ||
Ligne 100: | Ligne 94: | ||
test2/adresse.c:5bis, avenue linux | test2/adresse.c:5bis, avenue linux | ||
test2/adresse.c:3358, street gandhi | test2/adresse.c:3358, street gandhi | ||
- | </code> | + | </file> |
==== Les OPTIONS ==== | ==== Les OPTIONS ==== | ||
Ligne 107: | 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> | + | <file config retour de la commande> |
- | <code> | + | |
test1/essai.txt:2:tartempion eric | test1/essai.txt:2:tartempion eric | ||
test1/essai.txt:4:howard charles | test1/essai.txt:4:howard charles | ||
test2/adresse.c:1:25, rue de la source | test2/adresse.c:1:25, rue de la source | ||
test2/adresse.c:2:5bis, avenue linux | test2/adresse.c:2:5bis, avenue linux | ||
- | test2/adresse.c:3:3358, street gandhi</code> | + | test2/adresse.c:3:3358, street gandhi</file> |
=== option -i === | === option -i === | ||
Ligne 128: | 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 [[:doc:programmation:shell: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 144: | 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 150: | 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> | + | <file config retour de la commande>test1/essai.txt:2:tartempion eric</file> |
- | <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 [[:doc:programmation:shell:pipe | 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> |
+ | |||
+ | |||
+ | ==== Script pratique ==== | ||
+ | |||
+ | ==== La cinémathèque à Jojo ==== | ||
+ | |||
+ | Je suis avec une ligne de texte indiquant les fichiers des films d'une cinémathèque se présentant avec des dossier-titres&fichiers-films dedans. \\ | ||
+ | Je désire créer la liste de l'ensemble en utilisant [[doc:systeme:tree|la commande tree]]. | ||
+ | |||
+ | Je me retrouve donc avec une liste_films.txt où les titres des dossiers et ceux des films sont indiqués en même temps, il me faut donc supprimer toutes les lignes des fichiers des films. | ||
+ | |||
+ | Facile, ils ont tous leur extension propre, mkv VOB ou mp4. | ||
+ | |||
+ | Trêve de détail, voici la commande qui a conservé les titres des répertoires et supprimé tous ceux des films : | ||
+ | |||
+ | On se place où se situe le fichier des films titré avec tree, par exemple un fichier qu'on aura nommé liste.txt, et on envoi le bouzin : | ||
+ | <code user>grep -viE "\.(mkv|mp4|vob)" liste.txt</code> | ||
+ | |||
+ | Merci au captnfab qui a tout soufflé le procédé ! ;-) | ||
+ | |||
+ | ===== Lien vers le forum ===== | ||
+ | |||
+ | * [[https://debian-facile.org/viewtopic.php?pid=161583#p161583 | (Résolu) Cherche commande bash Oui - Non]] |