Quiero hablar sobre una herramienta de búsqueda que facilita mucho la vida. Cuando llego a un servidor y necesito buscar algo, lo primero que hago es verificar si está instalado ack. Esta herramienta es una excelente alternativa a grep, así como a find y wc en cierta medida. ¿Por qué no grep? Ack tiene configuraciones más agradables por defecto, opciones más comprensibles, expresiones regulares perl y un sistema de configuración. Si te gusta (o necesitas) buscar a través de la terminal, definitivamente deberías probarla.
Funciones básicas
Ack es recursivo por defecto, y escribir menos opciones siempre es bueno.
Podemos usar la bandera -w, para indicarle a la herramienta que busque instancias de nuestra plantilla rodeadas por límites de palabras (espacios, barras invertidas, etc.).
ack -w mysql
Ack admite búsqueda por tipo de archivo. Por ejemplo, busquemos la versión del módulo en archivos json.
ack --json '"version":s+"d+.d+.d+"'
La lista completa de tipos de archivos soportados se puede ver usando:
ack --help-typesA menudo, es necesario contar cuántas veces aparece una frase en un archivo de registro, por ejemplo, para entender cuántos datos ha procesado un script.
![]()
Contemos cuántas veces aparece process en el archivo test.log, sin importar el caso (, el intervalo entre el envío de paquetes.).
Podemos contar las ocurrencias no solo en un archivo específico, sino en un grupo. Ampliemos la búsqueda anterior de la palabra mysql: contemos el número de ocurrencias de las palabras (-c) en archivos *.js (—js), excluyendo archivos donde no se encontró nada (-h) y sumando el total.
# выведем на экран все вхождения
ack --js -w mysql
# считаем общую сумму вхождений
ack --js -wch mysql
Además, podemos obtener un informe detallado sobre la cantidad de ocurrencias en cada archivo usando (-l)
ack --js -w -cl mysql
Si necesitas contexto adicional para la búsqueda, puedes pedir a ack
que muestre líneas antes (-B) y después (-A) de la expresión encontrada. Para esto, debes indicar después de la opción cuántas líneas necesitas mostrar.
# 2 строки до
ack --js --column -B 2 "query.once('" ./lib/
# 2 строки после
ack --js --column -A 2 "query.once('" . /lib/
Y si necesitas ambos, usa (-C)
ack --js --column -C 2 "query.once('" .\/lib\/También hay una opción (-v) para invertir la búsqueda, es decir, mostrar líneas que no contengan la plantilla dada.
Expresión regular
Ack, a diferencia de grep, utiliza expresiones compatibles con Perl.
Para mí, eso es un gran punto a favor, no tengo que recordar una sintaxis diferente para las expresiones regulares.
ack 'vars+adds+'
Un ejemplo más complicado
ack '*s+[vd+.d+.d+]'
A menudo, se desea dejar en los resultados solo lo que coincide con la plantilla. Aquí ayudará la opción —output (-o)
ack -o '*s+[vd+.d+.d+]'
Además, mediante paréntesis podemos destacar la parte encontrada y referirnos a ella en la salida a través de la variable $[número del grupo]. Por ejemplo,
ack --output='la versión es $1' '*s+[v(d+.d+.d+)]'
Ack tiene opciones útiles —range-start y —range-end. Ayudan cuando
los datos no se almacenan en una sola línea, sino en múltiples líneas.
Por ejemplo, hay un archivo con código sql

Extraeremos los nombres de las columnas. El inicio del bloque será una línea que comience con SELECT y el final una línea que comience con FROM.
ack --range-start ^SELECT --range-end ^FROM 'td+.' ./test.sql
Si en la expresión de búsqueda participan caracteres especiales como el punto, paréntesis y otros, para no tener que escaparlos, se puede usar la opción -Q.
# Поиск с экранированием
ack --json 'mysql.'
# Поиск без экранирования
ack --json -Q mysql.
Trabajar con archivos
Obtener una lista de archivos con una extensión específica
ack -f --js
Encontrar todos los archivos js cuyo nombre empieza con P*, usando la opción (-g).
ack -g --js '/Pa.+.js$'
Configuración
La utilidad tiene su archivo de configuración. Se puede tener una configuración global para el usuario (~/.ackrc) así como una local para una carpeta específica (en la carpeta es necesario crear un archivo .ackrc).
La mayoría de las opciones que se especifican en las configuraciones también se pueden especificar manualmente al invocarlas. Analicemos algunas de ellas.
Ignorar carpeta al buscar
--ignore-dir=distAgregaremos un tipo de archivo personalizado: vue.
--type-add=vue:ext:js,vueAhora se puede usar la opción —vue para buscar en archivos .vue. Por ejemplo: ack —vue App.
Además, se puede especificar una lista de extensiones para esta opción. Por ejemplo, aquí al usar —vue también se procesarán .js archivos.
Игнорировать файлы, например, минифицированные *.min.js
--ignore-file=match:/\.min.js$/Instalación
CentOS
yum update -y && yum install ack -yUbuntu
apt-get update -y && apt-get install ack-grep -yMac OS
brew update && brew install ackInstalación desde el sitio web
curl https://beyondgrep.com/ack-v3.3.1 > ~/.bin/ack && chmod 0755 ~/.bin/ackPlugins para editores:
Conclusión
Esto no es toda la funcionalidad. Se puede ver la lista completa de funciones ejecutando:
ack --help
# o
ack --manLa utilidad ack permite hacer la búsqueda en terminales más conveniente y flexible. Y mediante pipelines (ack -C 10 hello | ack world) se puede crear una potente herramienta de búsqueda y filtrado de datos en el sistema de archivos y en los propios archivos.
Fuente: habr.com
