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.

No related posts.

flattr this!

10 comments

  1. 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…

  2. 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"

  3. 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

  4. Si ça marche sous Windows, ça peut être pas mal…

  5. Stephane

    J’avais fait un petit comparatif entre grep, ack-grep et grin par le passé :
    http://ascendances.wordpress.com/2012/02/17/comparatif-grep-ack-et-grin/

    Perso, ack-grep me semblait meilleur et l’écart de fonctionnalité m’a démotivé à contribuer pour améliorer grin et lui faire rattraper son retard.

  6. 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.

  7. 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!

  8. Vu qu’on est pas sous window, difficile à dire. Si c’est le même problème qu’ipython, pip install pyreadline peuvent peut-être résoudre le problème. Sinon peut être que ça ne marche tout simplement pas sous Window.

  9. 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!

  10. Il y a aussi Code Grep in Vi Grepped qui est pas mal non plus (https://github.com/jreybert/cgvg). Il propose deux commandes cg et vg qui permettent de chercher un motif, et de le visualiser/éditer en contexte avec vi.

Flux RSS des commentaires

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Jouer à mario en attendant que les autres répondent