Ack es mejor que grep

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 es mejor que grep

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+"'

Ack es mejor que grep

La lista completa de tipos de archivos soportados se puede ver usando:

ack --help-types

A 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.

Ack es mejor que grep
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

Ack es mejor que grep

Además, podemos obtener un informe detallado sobre la cantidad de ocurrencias en cada archivo usando (-l)

ack --js -w -cl mysql

Ack es mejor que grep

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/

Ack es mejor que grep

# 2 строки после 
ack --js --column -A 2 "query.once('" . /lib/

Ack es mejor que grep

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+'

Ack es mejor que grep

Un ejemplo más complicado

ack '*s+[vd+.d+.d+]'

Ack es mejor que grep

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+]'

Ack es mejor que grep

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 es mejor que grep

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

Ack es mejor que grep

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

Ack es mejor que grep

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.

Ack es mejor que grep

Trabajar con archivos

Obtener una lista de archivos con una extensión específica

ack -f --js

Ack es mejor que grep

Encontrar todos los archivos js cuyo nombre empieza con P*, usando la opción (-g).

ack -g --js '/Pa.+.js$'

Ack es mejor que grep

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=dist

Agregaremos un tipo de archivo personalizado: vue.

--type-add=vue:ext:js,vue

Ahora 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 -y

Ubuntu

apt-get update -y && apt-get install ack-grep -y

Mac OS

brew update && brew install ack

Instalación desde el sitio web

curl https://beyondgrep.com/ack-v3.3.1 > ~/.bin/ack && chmod 0755 ~/.bin/ack

Plugins para editores:

Conclusión

Esto no es toda la funcionalidad. Se puede ver la lista completa de funciones ejecutando:

ack --help
# o
ack --man

La 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

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster