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 [13/07/2010 10:03] smolski |
doc:systeme:grep [18/10/2012 03:30] smolski |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== 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 par de vos remarques, succès, améliorations ou échecs ! | ||
+ | * Objet : filtre grep | ||
+ | * Niveau requis : DÉBUTANT | ||
+ | * Commentaires : // Recherche de caractères dans des fichiers textes. // | ||
+ | * Débutant, à savoir : | ||
+ | [[manuel:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | ||
+ | |||
+ | 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 ! | ||
+ | |||
+ | Et puis là : | ||
+ | |||
+ | <note important>Aie ce lien n'existe plus : [[http://w3.uqo.ca/DOC/unx_grep.html]]</note> | ||
+ | |||
+ | 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 ===== | ||
+ | |||
+ | 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. | ||
+ | |||
+ | ===== TP01 ===== | ||
+ | |||
+ | ==== Créer les répertoires et fichiers exemples ==== | ||
+ | |||
+ | Créez un répertoire test1 avec un fichier nommé essai.txt comportant des noms et prénoms avec la commande [[cat]] : | ||
+ | <code bash> | ||
+ | mkdir test1</code> | ||
+ | |||
+ | Et créez(([[commande:cat]])) dedans un fichier **test1/essai.txt** rédigé ainsi : | ||
+ | <code bash> | ||
+ | cat > test1/essai.txt <<EOF</code> | ||
+ | tartempion eric | ||
+ | greg lucien | ||
+ | howard charles | ||
+ | santiago germaine | ||
+ | EOF</code> | ||
+ | |||
+ | Utilisez la commande [[commande:cat]] pour en vérifier le contenu : | ||
+ | <code bash>$ cat test1/essai.txt | ||
+ | |||
+ | tartempion eric | ||
+ | greg lucien | ||
+ | howard charles | ||
+ | santiago germaine</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 suivantes : | ||
+ | <code bash> | ||
+ | mkdir test2</code> | ||
+ | |||
+ | <code bash> | ||
+ | cat > test2/adresse.c <<EOF | ||
+ | 25, rue de la source | ||
+ | 5bis, avenue linux | ||
+ | 3358, street gandhi | ||
+ | EOF</code> | ||
+ | |||
+ | On vérifie les deux fichiers d'un coup ainsi : | ||
+ | <code bash> | ||
+ | cat ~/test1/essai.txt ~/test2/adresse.c</code> | ||
+ | <code>tartempion eric | ||
+ | greg lucien | ||
+ | howard charles | ||
+ | santiago germaine | ||
+ | 25, rue de la source | ||
+ | 5bis, avenue linux | ||
+ | 3358, street gandhi</code> | ||
+ | |||
+ | ===== Exemples Pratiques ===== | ||
+ | |||
+ | <note important>Si l'on omet __le nom de fichier__ à traiter, ''grep'' agit sur le fichier d'entrée (**stdin**). \\ | ||
+ | Voir commande : [[command:pwd]] | ||
+ | </note> | ||
+ | |||
+ | 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>tartempion eric | ||
+ | greg lucien | ||
+ | howard charles</code> | ||
+ | |||
+ | Et celle-là pour la lettre "**u**" : | ||
+ | <code bash>$ grep u ~/test1/essai.txt</code> | ||
+ | <code>greg lucien</code> | ||
+ | |||
+ | |||
+ | 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 : | ||
+ | - /home de l'//user// | ||
+ | - à l'interieur des répertoires commençant par "**te**" | ||
+ | - tous les types de fichiers dont les chaînes de caractère contiennent la lettre "**a**" | ||
+ | |||
+ | <code bash>$ grep a ~/te*/*</code> | ||
+ | <code> | ||
+ | test1/essai.txt:tartempion eric | ||
+ | test1/essai.txt:howard charles | ||
+ | test2/adresse.c:25, rue de la source | ||
+ | test2/adresse.c:5bis, avenue linux | ||
+ | test2/adresse.c:3358, street gandhi | ||
+ | </code> | ||
+ | |||
+ | ==== Les OPTIONS ==== | ||
+ | |||
+ | === option -n === | ||
+ | |||
+ | L'option ''-n'' ajoute le numéro de ligne, ainsi : | ||
+ | <code bash> | ||
+ | $ grep -n a ~/te*/*</code> | ||
+ | <code> | ||
+ | test1/essai.txt:2:tartempion eric | ||
+ | test1/essai.txt:4:howard charles | ||
+ | test2/adresse.c:1:25, rue de la source | ||
+ | test2/adresse.c:2:5bis, avenue linux | ||
+ | test2/adresse.c:3:3358, street gandhi</code> | ||
+ | |||
+ | === option -i === | ||
+ | |||
+ | L'option ''-i'' permet d'ignorer la casse (ne fait pas la distinction entre les lettres majuscules et minuscules). | ||
+ | |||
+ | === option -v === | ||
+ | |||
+ | L'option ''-v'' fait la négation, c'est-à-dire qu'elle affiche toutes les lignes, SAUF celles qui contiennent la chaîne de caractères donnée. | ||
+ | |||
+ | === option -c === | ||
+ | |||
+ | L'option ''-c'' ne donne que le nombre de lignes où la chaîne apparaît __sans afficher ces lignes__. | ||
+ | |||
+ | ==== Expressions régulières ==== | ||
+ | |||
+ | Les expressions régulières, ou [[regexp]], peuvent remplacer la chaîne de caractères dans l'argument du programme grep. | ||
+ | |||
+ | Voici des exemples : | ||
+ | ^ Expression ^ Valeur | | ||
+ | | abc | Cherche la chaîne abc n'importe où dans la ligne. | | ||
+ | | %%^%%abc | Cherche la chaîne abc en début de ligne. | | ||
+ | | abc$ | Cherche la chaîne abc en fin de ligne. | | ||
+ | | %%^%%abc$ | Cherche les ligne ne contenant que abc (commençant et se terminant par abc). | | ||
+ | | st[a-z][a-z]ic | Cherche n'importe quelle chaîne de caractères commençant par st, suivie de deux lettres minuscules et se terminant par ic (i.e static). | | ||
+ | | %%^%%int %%*%% main | Cherche n'importe quelle chaîne de caractères en début de ligne commençant par int, suivie de n'importe quoi et se terminant par argc (i.e int main (int argc, char %%**%%argv)). | | ||
+ | | X[0-2][0-9] |Cherche n'importe quelle chaîne de caractères commençant par X, suivie de 0, 1, ou 2 et se terminant par un chiffre (i.e X11).| | ||
+ | |||
+ | **Nota :** | ||
+ | |||
+ | Programme grep avec expressions régulières : | ||
+ | |||
+ | Il faut toutefois prendre un soin particulier lorsque l'on utilise les caractères spéciaux : \\ | ||
+ | ''$, *, [, ], ^, |, (, )'' \\ | ||
+ | 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 : | ||
+ | <code bash> | ||
+ | $ grep -n "^t" te*/*</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**. | ||
+ | |||
+ | Pour plus d'information sur la commande grep, lancez : | ||
+ | $ man grep. |