Un autre grep : ack

Anne ack grep

L’utilitaire ack est un genre de grep, mais il est plutôt destiné à des programmeurs qui font des recherches globales dans toute une arborescence.

Il s’installe facilement avec le gestionnaire de paquet.

Par défaut, il ignore les fichiers et répertoires des outils de gestion de version (.git, .svn, …). On peut donc simplement faire:

$ ack toto

Cela recherche récursivement dans le répertoires courant et tous ses sous-répertoires.

Affichage

L’affichage est configurable, mais je le trouve joli par défaut. J’ai juste ajusté les couleurs dans mon .ackrc :

# Possible color values are: clear, reset,
# dark, bold, underline, underscore, blink, reverse, concealed
# black, red, green, yellow, blue, magenta,
# on_black, on_red, on_green, on_yellow, on_blue, on_magenta, on_cyan, on_white
--color-filename=bold
--color-match=bold red
--color-lineno=magenta

Langages

On précisant le langage, la recherche ne se fait que des les fichiers ayant une certaine extension. Par exemple, pour ne chercher que dans les fichiers .c et .h :

$ ack --cc toto

On peut aussi utiliser l’option de langage pour avoir la liste de tous les fichier correspondant :

$ ack -f --cc

On peut voir les langages prédéfinis avec :

$ ack --help-types

On a entre autres :

    --[no]cc           .c .h .xs
    --[no]make         .mk; .mak; makefile; Makefile; GNUmakefile
    --[no]perl         .pl .pm .pod .t; first line matches /^#!.*\bperl/
    --[no]shell        .sh .bash .csh .tcsh .ksh .zsh .fish; first line matches /^#!.*\b(?:ba|t?c|k|z|fi)?sh\b/
    --[no]ocaml        .ml .mli

On remarque que l’on peut aussi chercher dans tous les fichiers, sauf certains, comme par exemple, tous les fichiers sauf les Makefile :

$ ack --nomake toto

Il est facile d’ajouter un langage, c’est-à-dire de donner un nom à un ensemble d’extensions. J’ai par exemple ajouté dans mon .ackrc :

--type-add=ccc:ext:c
--type-add=cch:ext:h
--type-add=t2t:ext:t2t
--type-add=ml:ext:ml
--type-add=mli:ext:mli

Expressions

Les expressions à rechercher s’exprime à l’aide d’expressions régulières Perl, et on peut construire la sortie en utilisation des sous-expressions de la recherche. Pour chercher tous les fichiers inclus par exemple :

$ ack --cc '#include\s+<(.*)>' --output '$1'

L’option -h permet de ne pas afficher les noms de fichiers et numéros de ligne de la provenance si on veut une liste brute.

Voir aussi :