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:
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.
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…
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"
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
Si ça marche sous Windows, ça peut être pas mal…
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.
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.
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!
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.
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!
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
etvg
qui permettent de chercher un motif, et de le visualiser/éditer en contexte avec vi.D’ailleurs The Silver Searcher c’est
ack
sous steroïdes : http://geoff.greer.fm/2011/12/27/the-silver-searcher-better-than-ack/Le dernier concurrent solide en course : Ripgrep => https://github.com/BurntSushi/ripgrep
Même fonctionnalité que Silver searcher mais avec encore de meilleur performances! (benchs à l’appui)
Ca a l’air super cool
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…)