URL: https://linuxfr.org/users/vmagnin/journaux/la-commande-ack-one-step-beyond-grep Title: La commande ack, one step beyond grep ! Authors: vmagnin Date: 2021年11月29日T19:57:11+01:00 License: CC By-SA Tags: ack, grep, ligne_de_commande, regex, commande et ubuntu Score: 26 L'URL du site de la commande ack annonce la couleur[^1] : https://beyondgrep.com/. J'ai l'habitude d’agripper les motifs avec grep, mais je m'essaie depuis quelques temps à les acquérir avec ack [^2]. Le deuxième et dernier journal sur cette commande datant d'avril 2013 (voir le tag [ack](https://linuxfr.org/tags/ack/public)), il est temps de faire une piqûre de rappel aux citoyens du libre. # Version 3 En 2019, ack est passée en version 3. La version actuelle est la 3.5.0 (mars 2021), et la version disponible dans Ubuntu 21.10 est la 3.4.0. Les nouveautés sont résumées sur la page principale du site. La commande est écrite en Perl 5 et les dépendances sont minimales : ```bash $ apt show ack [...] Depends: libfile-next-perl (>= 1.18), perl:any Breaks: ack-grep (<= 2.14-5~) Replaces: ack-grep (<= 2.14-5~) [...] ``` Cela permet de la proposer facilement pour la plupart des systèmes d'exploitation : Linux, macOS, *BSD et Windows. On voit également que dans Ubuntu la commande s'appelait auparavant `ack-grep`, soit 100 % plus long que `grep`. Devenue `ack`, elle prend l'avantage en étant 25 % plus courte ;-) # Usages ## Chercher dans les contenus des fichiers Étant écrite en Perl, ack utilise bien sûr les expressions régulières Perl [^3] de façon native. L'usage en est très simple : `ack [options] PATTERN [FILE...]` Un des avantages de ack sur grep est qu'elle utilise par défaut un certain nombre d'options utiles : récursion des répertoires, affichage des numéros de lignes, coloration syntaxique et surbrillance du motif recherché (sauf redirection)... De plus, elle ignore par défaut de nombreux fichiers (images, archives, sauvegardes, PDF...) et répertoires (`.git`, `__pycache__`, `CMakeFiles`...), ce qui participe à sa rapidité. La commande `ack --dump` vous en donnera la liste avec une syntaxe limpide. Les principales fonctionnalités de ack et d'autres alternatives à grep sont résumées dans ce [tableau](https://beyondgrep.com/feature-comparison/). Voici une courte sélection personnelle parmi les nombreuses options disponibles : ``` -l, --files-with-matches Print filenames with at least one match -i, --ignore-case Ignore case distinctions in PATTERN -w, --word-regexp Force PATTERN to match only whole words -m, --max-count=NUM Stop searching in each file after NUM matches -C [NUM], --context[=NUM] Print NUM lines (default 2) of output context. -t X, --type=X Include only X files, where X is a filetype, e.g. python, html, markdown, etc -s Suppress error messages about nonexistent or unreadable files. ``` Notez que l'option `-t` peut être utilisée encore plus simplement, par exemple : ```bash $ ack LinuxFr --markdown ``` L'option peut facilement être inversée pour au contraire éviter certains fichiers : `--nomarkdown`. Pour déterminer le type d'un fichier, la commande se base non seulement sur les extensions des noms de fichiers mais aussi sur les *shebang.* Les types disponibles peuvent être obtenus avec à nouveau la commande `ack --dump`. ## Chercher dans les noms ou les types de fichiers Avec l'option `-g`, on peut chercher le motif dans les noms des fichiers plutôt que dans leur contenu. Par exemple, cherchons des fichiers de configuration cachés : ```bash $ ack -g ^[.].*rc$ ``` Avec l'option `-f` on pourra par exemple afficher simplement la liste des fichiers d'un type donné présents dans une arborescence : ```bash $ ack -f --shell ``` # Personnalisation Pour personnaliser le comportement de la commande, on peut créer un fichier de configuration contenant toutes les options et paramètres définis par défaut : ```bash $ ack --create-ackrc> ~/.ackrc ``` Exemple concret, j'aime bien utiliser des terminaux avec caractères noirs sur fond jaune clair mais par défaut ack affiche les numéros de ligne en jaune. J'ai donc simplement ajouté dans mon `.ackrc` la ligne suivante : ``` --color-lineno=Red ``` # Conclusion ack est le genre de commande que l'on risque d'adopter rapidement après essai : simple, rapide, efficace, agréable à utiliser, comportement facilement personnalisable... Il est même possible de l'appeler depuis [certains outils](https://beyondgrep.com/more-tools/) tels que vim ou emacs. Mais il est vrai que grep bénéficie de la prime au premier entrant. Pour un script à distribuer, grep a l'avantage d'être installée sur tous les systèmes libres, même si ses variantes peuvent éventuellement introduire quelques problèmes de compatibilité. En tout cas, pour votre usage quotidien vous risquez vraiment d'être séduit(e)s par ack. # *Acknowledgements* `ack` est essentiellement l'oeuvre d'[Andy Lester](https://blog.petdance.com/), alias petdance sur [GitHub](https://github.com/beyondgrep/ack3). Elle est sous licence *Artistic License 2.0*. # Références [^1]: Prince Buster, [One Step Beyond](https://www.youtube.com/watch?v=3dnhpK_TnQM), 1964. [^2]: Auverlot Olivier, "Ack, le super grep", *Linux Pratique,* HS n°52, octobre 2021, https://connect.ed-diamond.com/linux-pratique/lphs-052/ack-le-super-grep [^3]: Bernard Desgraupes, *Introduction aux expressions régulières,* Paris : Vuibert, 2e édition, 2008, ISBN 978-2-7117-4867-9.