Una de las herramientas que utilizo con mas frecuencia en el terminal es grep
. Lo utilizo tanto en el modo depuración, para la búsqueda de errores, como cuando estoy buscando un archivo entre toda la documentación que se encuentra en mi equipo. Todos los artículos publicados aquí, en atareao.es, los tengo organizados en directorios por años y por artículo. De esta forma buscar un determinado artículo, puede ser algo realmente largo e incluso tedioso. En estos casos utilizo grep
. Pero, por supuesto, que no es la única herramienta que tienes disponible, también tienes ag, The Silver Searcher, un buscador enfocado en la rapidez.
De hecho, grep
es un comando completamente integrado con Vim, de forma que utiliza este comando a la hora de realizar sus búsquedas. Sin embargo, es posible, reemplazar esta herramienta por ag
para dotar a Vim de mayor rapidez en sus búsquedas de texto.
Sea como fuere, que utilizas grep
para tus búsquedas de archivos o integrado en Vim, por ejemplo, en este artículo, te comentaré sobre ag, y como puedes aumentar tu productividad con esta herramienta.
ag una alternativa a grep
ag es una herramienta completamente enfocada en la búsqueda de texto en archivos, y en la velocidad. Se trata de una herramienta muy, pero que muy, rápida. Algo a lo que le tienes que sacar partido.
Además si eres de los que trabaja siempre con código, puedes hacer que esta herramienta ignore la búsqueda en algunos archivos, añadiendo esos archivos, o la extensión de esos archivos en un .gitignore
. Así de fácil.
Instalación
ag, The Silver Searcher, se encuentra en los repositorio oficiales de Ubuntu y de la mayoría de distribuciones, por lo que, instalarlo, es tan sencillo como ejecutar,
sudo apt install silversearcher-ag
Uso y funcionamiento
Una vez instalado, ya puedes sacar partido a esta herramienta de búsqueda de texto. Así, algunos usos rápidos de esta herramienta pueden ser los siguiente,
ag código
buscará la palabracódigo
entre todos los archivos imprimiendo el archivo y la línea del archivo donde la ha encontrado- Si quieres hacer lo mismo que en el punto anterior pero solo en los archivos de la ruta
ruta/a/directorio
, lo que tienes que ejecutar esag código ruta/a/directorio
. - Si solo quieres ver en que archivos se encuentra, tienes que ejecutarlo como
ag -l código
. Pero si quieres ver el archivo y la línea en la que se encuentra, pero solo imprimir la coincidencia, utilizaag -o código
. - ¿Y si no quieres tener en cuenta si está en mayúsculas o minúsculas?. En este caso la forma de ejecutarlo es
ag -i código
. Igual que en el caso anterior, si además solo quisieras ver la coincidencia, tendrías que utilizarag -i -o código
o en su versión mas abreviadaag -io código
. - En el caso de que quieras buscar la palabra en cuestión, en archivos que cumplan un determinado patrón puedes ejecutar
ag código -G txt
oag código -G <nombre-del-archivo>
. - Por supuesto, y como no podía ser de otra forma, ag, también te permite buscar por expresiones regulares. Así, en el caso de que quieras buscar archivos que tengan frases que comiencen con la palabra Código, podrías hacerlo con
ag '^Código\s'
.
Filtrado por tipo de archivo
Pero sin lugar a dudas, uno de las grandes ventajas de utilizar ag para tus búsquedas es la posibilidad de buscar por tipo de archivo. En lugar de buscar en todos los archivos, puedes buscar únicamente en los archivos de un determinado formato. Para conocer todos los archivos soportados ejecuta ag --list-file-types
.
Así, por ejemplo, si quisieras buscar la palabra código
en todos los archivos de tipo markdown tendrías que ejecutar lo siguiente con grep
,
find . -type f -name "*.md" -exec grep "código" {} \;
Esto mismo, ejecutado utilizando ag
queda de la siguiente manera,
ag --md código
Por supuesto, no solo se trata de que la instrucción utilizada es mucho mas corta. También está en la rapidez. Así, ejecutando estas dos instrucciones en mi directorio de artículos, los resultados fueron los siguientes,
- Para el caso de grep => 1,488s
- En el caso de ag => 0,295s
No hace falta que te diga nada al respecto. Está muy clara la diferencia entre realizar la búsqueda con grep
y con ag
.
Infinidad de opciones
Estos ejemplos que te he indicado anteriormente, no son mas que la punta del iceberg de las opciones que ofrece ag
para realizar las búsquedas.
Así puedes indicarle que te muestre algunas líneas antes de la coincidencia con -B
o después de la coincidencia con -A
. Puedes que te indique solo el número de apariciones por archivo con -c
. Puedes indicarle que haga o no, búsquedas recursivas e indicar el número de niveles de búsqueda en directorios con --depth
, o que siga enlaces simbólicos. Igualmente, puedes indicarle que solo imprima las líneas muy largas, o que no tenga en cuenta mayúsculas o minúsculas. Y por supuesto, puedes mostrar las estadísticas de las búsquedas utilizando --stats
. Esto te muestra un resultado como el que puedes ver a continuación,
444 matches
186 files contained matches
761 files searched
4851772 bytes searched
0.258351 seconds
Vamos, que si quieres saber todas las opciones que te ofrece esta herramienta, tienes que recurrir a man ag
Configuración con Vim
Si quieres utilizar ag con Vim, tienes un estupendo complemento que te hará la vida mas fácil, se trata de ack.vim. Aunque este complemento está pensado para utilizarlo con ack
, lo puedes particularizar para ag, añadiendo alguna de las siguientes instrucciones,
let g:ackprg = 'ag --nogroup --nocolor --column'
o
let g:ackprg = 'ag --vimgrep'
Otra opción, si no quieres añadir un nuevo complemento a tu configuración de Vim, es incluir lo siguiente,
if executable('ag')
" Use ag over grep
set grepprg=ag\ --nogroup\ --nocolor
" Use ag in CtrlP for listing files. Lightning fast and respects .gitignore
let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
" ag is fast enough that CtrlP doesn't need to cache
let g:ctrlp_use_caching = 0
" bind K to grep word under cursor
nnoremap K :grep! "\b<C-R><C-W>\b"<CR>:cw<CR>
" bind \ (backward slash) to grep shortcut
command -nargs=+ -complete=file -bar Ag silent! grep! <args>|cwindow|redraw!
nnoremap \ :Ag<SPACE>
endif
Más información,
Imagen de portada de Chase Clark en Unsplash