IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

grep -r : commande grep avec l'option -r (recursive)


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 161
    Par défaut grep -r : commande grep avec l'option -r (recursive)
    Bonjour,

    Voici un grep récursif qui marche bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ grep -r pris
    Test_cmd_shell_21/xgrepf_brouillard.txt:Le brouillard a tout pris
    Import_L_vers_M_le_14FEV2021/peb1.sh:# SORTIE : Fichier modifie pour prise de décision
    Comment améliorer cette même commande, en ne faisant la recherche que parmi les scripts shell "*.sh" ?

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 654
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    Bonjour,

    en bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ shopt -s globstar
    $ grep pris **/*.sh
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 161
    Par défaut
    Merci N_BaH,

    effectivement ça marche bien avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ grep pris **/*.sh
    #ou
    $ grep pris */*.sh
    mais; pourquoi ça marche ?
    \ : inhibition de caractère ??

    ou, que lire pour comprendre ?

  4. #4
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -r --include='*.sh' pris

  5. #5
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 161
    Par défaut
    Merci balkani,

    Il faudra aussi que je regarde cette option du grep pour bien comprendre !

    J'ai testé les différents codes proposés (sur un autre PC Linux)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liam@Odi:~/projets$ grep -r pris **/*.sh     # => renvoie 8 lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    liam@Odi:~/projets$ shopt -s globstar
    liam@Odi:~/projets$ grep -r pris **/*.sh                 # => renvoie ces 8 mêmes lignes plus 2 autres !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liam@Odi:~/projets$ grep -r --include='*.sh' pris    # => renvoie les 10 mêmes lignes que la commande précédente (avec globstar)
    Du coup, sans rentrer dans les détails, l'option avec --include me paraît plus fiable (pour ceux qui ne veulent pas jouer avec globstar)

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    Houlala. Attends. On se pose. On boit frais. Et on réfléchit à ce qu'on a.

    Dans la première ligne, tu utilises la double étoile sans activer l'option. Donc c'est comme si tu écrivais */*.sh. Tu désignes donc les scripts dans le premier niveau de dossier; ni ceux à la racine, ni ceux plus profond.

    Dans la deuxième tentative, tu as 10 lignes. Je suis prêt à parier que les 2 fichiers en plus sont, soit à la racine, soit dans un dossier dans un dossier. Car tu as activé globstar.

    Dans la troisième tentative, tu confies à grep la récurrence. Il chasse à la racine et dans tous les niveaux de dossiers. (D'ailleurs il doit manquer une étoile ou un point en fin de commande).

  7. #7
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    (D'ailleurs il doit manquer une étoile ou un point en fin de commande).
    Le point est implicite avec -r.

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 654
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    qu'appelles-tu "la racine" ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Citation Envoyé par balkany Voir le message
    Le point est implicite avec -r.
    Je ne comprends pas ta réponse. Ce qui est implicite, c'est de filtrer l'entrée standard. Si tu veux filtrer les fichiers, tu dois le dire.

    Citation Envoyé par N_BaH Voir le message
    qu'appelles-tu "la racine" ?
    La racine de l'arborescence. J'aurais sans doute mieux fait de dire "le dossier courant".

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ ls **/*.txt | wc -l
    17
    $ ls */*.txt | wc -l
    17
    $ ls *.txt | wc -l
    14
    $ shopt -s globstar
    $ ls **/*.txt | wc -l
    36
    Il y a 14 fichiers texte dans le dossier courant (non comptés par Liamm), 17 fichiers texte au premier niveau, tous dossiers confondus. Et quand on active globstar, il y a 5 fichiers non identifiés (36=14+17+5). Ce sont les fichiers texte plus profonds que le premier niveau.
    Chez Liamm, les 2 fichiers en plus viennent du groupe des 14 ou du groupe des 5 de mon exemple. J'espère que c'est compréhensible.

  10. #10
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Je ne comprends pas ta réponse. Ce qui est implicite, c'est de filtrer l'entrée standard. Si tu veux filtrer les fichiers, tu dois le dire.
    Chez moi j'ai
    Citation Envoyé par man grep
    -r, --recursive
    Read all files under each directory, recursively, following symbolic links only if they are on the command line. Note that if no file operand is given, grep searches the working directory.
    Et avec -r, l'entrée standard est ignorée (à moins de forcer sa prise en compte en mettant - pour fichier).

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 654
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    Citation Envoyé par Flodelarab
    La racine de l'arborescence. J'aurais sans doute mieux fait de dire "le dossier courant".
    oui, parce que "la racine de l'arborescence", c'est-à-dire la racine du système de fichiers, c'est /.
    le répertoire courant, c'est plus clair.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Liamm Voir le message
    effectivement ça marche bien avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ grep pris **/*.sh
    #ou
    $ grep pris */*.sh
    mais; pourquoi ça marche ?
    Àmha de simple posixien amateur, si globstar n'est pas positionné, **/ et */ représentent la même chose:
    tous les répertoires de 1er niveau (hormis, bien évidemment, les invisibles, ceux qui commencent par un ., et notamment ./ et ../ !)

    Citation Envoyé par Liamm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    liam@Odi:~/projets$ shopt -s globstar
    liam@Odi:~/projets$ grep -r pris **/*.sh                 # => renvoie ces 8 mêmes lignes plus 2 autres !
    Je ne serais pas surpris que les 8 lignes correspondent à des répertoires de 1er niveau et les 2 lignes supplémentaires à des sous-répertoires. ou à des fichiers dans le répertoire courant.

    Bien sûr, j'ai un peu de mal à tester le globstar sur un bash antédiluvien (je n'ai pas encore migré en zsh sous macos).

    Et je ne peux donc pas expérimenter si **/*.sh renvoie également les fichiers à la base, comme *.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ shopt -s globstar
    -bash: shopt: globstar: invalid shell option name
    $ echo $BASH_VERSION
    3.2.57(1)-release

  13. #13
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 161
    Par défaut
    Merci à tous,
    Je suis content que ma question ait soulevé pas mal d'interrogations ! :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Commande join avec l'option -o
    Par Liamm dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 05/03/2021, 19h24
  2. Réponses: 4
    Dernier message: 09/10/2020, 09h38
  3. Filtrer le résultat de la commande "env" avec "grep"
    Par Silvarsh dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 20/06/2019, 15h46
  4. Bash: Association de commande(s) avec grep impossible.
    Par push221 dans le forum Shell et commandes GNU
    Réponses: 21
    Dernier message: 27/12/2018, 21h24
  5. Grep avec plusieurs possibilite
    Par Darfox dans le forum Web
    Réponses: 5
    Dernier message: 31/07/2008, 11h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo