Grin, le grep Python sous steroïd


Chercher un mot dans 500 fichiers est un truc que nous, pauvres développeurs, avons besoin de faire assez souvent.

Sublime Text le fait très bien avec Maj + Ctrl + F, mais on est pas toujours dans son éditeur. La recherche dans tout le système type Spotlight est généralement bien large, et la seule solution qui ait la bonne puissance de frappe, tout en affichant plein de détails reste grep. Problème, il faut connaître un max d’options de grep, utiliser egrep pour avoir de bonnes regex, et piper la sortie pour avoir certains résultats.

Le monde de perl a trouvé depuis longtemps une solution à ce problème au travers de ack, et comme les pythonistes, c’est que des gros copieurs, ils ont fait leur version: grin.

C’est sur pypi:

pip install grin

Et ça s’utilise ainsi:

grin test

Et il va vous sortir la liste des fichiers qui contiennent “test”, et dans quel contexte, avec coloration:

Capture d'écran de la sortie du programme grin

Génial quand on est en remote sur un serveur

Grin vient avec quelques goodies en plus:

  • Récursif par défaut.
  • Ignore les dossiers .git, .svn, etc et les fichiers temporaires (~, .tmp, etc) par défaut.
  • Cherche à l’intérieur de certaines archives.
  • Très rapide.
  • Accepte une expression rationnelle Python à la place du mot à chercher !

Par exemple pour chercher uniquement les fichiers qui contiennent le mot “test” ou “tests” à la fin d’une ligne dans un fichier Python, récursivement:

~/Work $ grin tests?$ -I *.py
./archives/client/project/apps/accounts/tests.py:
   65 :     # Used in Login test
./archives/client/project/apps/grants/tests.py:
   16 : # moving settings for testing to settings_test
./archives/client/project/apps/hivtest/tests.py:
  293 :         # print updated_hivtest
./archives/client/project/apps/home/tests.py:
   15 : # moving settings for testing to settings_test
...

Le code source est simple à comprendre, et il est fait de manière modulaire de telle sorte qu’on puisse réutiliser grin comme une lib externe pour chercher des choses avec son propre programme.

14 thoughts on “Grin, le grep Python sous steroïd

  • Soli

    D’abord, si je suis toujours dans mon éditeur !!!
    Ensuite, comme avec ack, finalement je me préfère utiliser grep avec les bonnes options :

    export GREP_OPTIONS='-nRI --color=always --exclude-dir=__pycache__ --exclude-dir=.nodeproject --exclude-dir=CVS --exclude-dir=SVN --exclude-dir=.git --exclude-dir=.hg'

    le gros avantage c’est que ça marche partout sans installation…

  • Cyprien

    Sinon, on peux aussi utiliser, si on n’a pas les acces pour installer ce genre d’outil sur une machine:
    find *.c | xargs grep "ce que je cherche"

  • foxmask

    bonjour,
    on va surement y aller tous avec son “j’ai le meilleur” ;)

    ack-grep est le must pour moi ; recherche recursive coloration de la chaine trouver dans le fichier bidule avec le num de ligne et j’en passe;)

    voilou

  • Sébastien

    Il y a surtout git grep qui envoie du bois. Il est vraiment, mais vraiment super rapide, ne regarde que le code géré dans git (donc pratique pour éviter tous les fichiers générés, les logs etc.) et est récursif par défaut.
    Quand on est dans un dépôt git, le must. Sinon, en effet grin est sympa.

  • Syl

    Salut,
    Je suis sous windows et malgré l’absence totale d’erreur à l’importation/utilisation de grin, la coloration syntaxique ne fonctionne pas (j’ai essayé l’option –force-color, mais ça n’arrange rien)….vous avez rencontré le même problème?

    Sinon, à part ça, c’est clair, ça déboite!

  • Syl

    Non non, pas de soucis avec la coloration sur ipython, et pyreadline est bien installé.

    Bon ben tant pis, c’est déjà pas mal comme ça! Je mettrais peut-être le nez dans le code un de ces quatre…

    Merci quand même!

  • Siltaar

    Pour compléter l’exemple classique find / xargs, voici la version qui supporte les espaces dans les noms de fichier :

    find “$3” -name “$2” -print0 | xargs -0 grep -i -n –color $1

    $1 : quoi comme texte

    $2 : dans quoi comme fichier

    $3 : à partir de quel dossier ?

    (et oui, ça se range bien dans petit script shell…)

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.