Je veux parler d'un utilitaire de recherche qui simplifie énormément la vie. Lorsque je me connecte à un serveur et que j'ai besoin de faire une recherche, je vérifie d'abord si ack est installé. Cet utilitaire est un excellent substitut à grep, et en quelque sorte à find et wc. Pourquoi pas grep ? Ack a des réglages par défaut plus agréables, des options plus lisibles, des expressions régulières perl et un système de configuration. Si vous aimez (ou devez) chercher dans le terminal, vous devez absolument l'essayer.
Fonctionnalités de base
Ack est par défaut récursif, et avoir moins d'options à écrire est toujours un avantage.
Nous pouvons utiliser le drapeau -w, pour dire à l'utilitaire de rechercher une instance de notre modèle, entourée de délimitations de mots (espaces, barres obliques, etc.).
ack -w mysql
Ack prend en charge la recherche par type de fichiers. Par exemple, cherchons la version du module dans les fichiers json.
ack --json '"version":s+"\d+.\d+.\d+"'
La liste complète des types de fichiers pris en charge peut être consultée avec :
ack --help-typesIl faut souvent compter combien de fois une phrase apparaît dans un fichier log, par exemple pour comprendre combien de données un script a traitées.
![]()
Comptons combien de fois le mot process apparaît dans le fichier test.log, sans tenir compte de la casse (-i).
Nous pouvons compter les occurrences non seulement dans un fichier spécifique, mais dans un groupe. Améliorons la recherche précédente du mot mysql : comptons le nombre d'occurrences (-c) dans les fichiers *.js (—js), en excluant les fichiers où rien n'a été trouvé (-h) et en totalisant le résultat.
# выведем на экран все вхождения
ack --js -w mysql
# считаем общую сумму вхождений
ack --js -wch mysql
De plus, nous pouvons obtenir un rapport détaillé sur le nombre d'occurrences dans chaque fichier avec (-l)
ack --js -w -cl mysql
Si vous avez besoin de contexte supplémentaire pour la recherche, vous pouvez demander à ack
d'afficher les lignes avant (-B) et après (-A) l'expression trouvée. Pour cela, vous devez indiquer après l'option le nombre de lignes à afficher.
# 2 строки до
ack --js --column -B 2 "query.once('" ./lib/
# 2 строки после
ack --js --column -A 2 "query.once('" . /lib/
Et si vous avez besoin des deux, utilisez (-C)
ack --js --column -C 2 "query.once('" .\/lib\/Il y a aussi une option (-v) pour inverser la recherche, c'est-à-dire montrer les lignes qui ne contiennent pas le modèle spécifié.
Expression régulière
Ack, contrairement à grep, utilise des expressions compatibles avec Perl.
Pour moi, c'est un gros avantage, je n'ai pas à mémoriser une syntaxe distincte pour les regex.
ack 'vars+adds+'
Un exemple plus complexe
ack '*s+[vd+.d+.d+]'
Il est souvent souhaitable de laisser dans les résultats uniquement ce qui correspond au modèle. L'option —output aidera ici (-o)
ack -o '*s+[vd+.d+.d+]'
De plus, grâce aux parenthèses, nous pouvons extraire la partie trouvée et y accéder dans la sortie via la variable $[numéro du groupe]. Par exemple,
ack --output='version est $1' '*s+[v(d+.d+.d+)]'
Ack a des options utiles —range-start et —range-end. Elles sont utiles lorsque
les données ne sont pas stockées sur une seule ligne, mais sous forme multiligne.
Par exemple, il existe un fichier avec du code SQL

Extraire les noms des colonnes. Le début du bloc sera une ligne commençant par SELECT, et la fin sera une ligne commençant par FROM.
ack --range-start ^SELECT --range-end ^FROM 'td+.' .\/test.sql
Si l'expression de recherche inclut des caractères spéciaux tels que le point, la parenthèse, et d'autres, pour éviter de les échapper avec , on peut utiliser l'option -Q.
# Поиск с экранированием
ack --json 'mysql.'
# Поиск без экранирования
ack --json -Q mysql.
Travailler avec des fichiers
Obtenir une liste de fichiers avec une certaine extension
ack -f --js
Trouver tous les fichiers js dont le nom commence par P*, en utilisant l'option (-g).
ack -g --js '\/Pa.+.js$'
Configuration
L'outil a son propre fichier de configuration. On peut avoir une configuration globale pour l'utilisateur (~\/ .ackrc) ou locale pour un dossier spécifique (il faut créer un fichier .ackrc dans le dossier).
La plupart des options spécifiées dans les configurations peuvent aussi être écrites manuellement lors de l'appel. Analysons quelques-unes d'elles.
Ignorer le dossier lors de la recherche
--ignore-dir=distAjoutons un type de fichier personnalisé —vue.
--type-add=vue:ext:js,vueOn peut maintenant utiliser l'option —vue, pour rechercher dans les fichiers .vue. Par exemple : ack —vue App.
On peut également spécifier une liste d'extensions pour cette option. Par exemple, en utilisant —vue, cela inclura aussi .js fichiers.
Игнорировать файлы, например, минифицированные *.min.js
--ignore-file=match:\/.min.js$\/Installation
CentOS
yum update -y && yum install ack -yUbuntu
apt-get update -y && apt-get install ack-grep -yMac OS
brew update && brew install ackInstallation depuis le site
curl https:\/\/beyondgrep.com\/ack-v3.3.1 > ~\/bin\/ack && chmod 0755 ~\/bin\/ackPlugins pour les éditeurs :
Conclusion
Ce n'est pas toutes les fonctionnalités. Vous pouvez voir la liste complète des fonctions en exécutant :
ack –-help
# ou
ack --manL'outil ack facilite la recherche dans le terminal et offre plus de flexibilité. Avec l'utilisation de pipeline (ack -C 10 hello | ack world), il est possible de créer un puissant combiné de recherche et de filtrage de données dans le système de fichiers et dans les fichiers eux-mêmes.
Source : habr.com
