Buscando texto más allá de grep
Cuando necesito encontrar algo en mi ordenador, mis primeras opciones
son siempre grep
y find
... quizá soy de la vieja escuela porque
para sustituir a esas herramientas se han propuesto infinidad de
herramientas posteriores que han ido apareciendo, pero no me han ido
calando. Durante un tiempo utilicé mlocate
para localizar ficheros,
pero posteriormente regresé a find
de nuevo y continúo utilizándolo
de manera habitual.
Con grep
no había probado alternativas hasta ahora. Supongo que como
todos, Había oído hablar de ack
, que promete una búsqueda más
efectiva, pero nunca lo he probado, así que no puedo hablar, ─ni bien,
ni mal─, de esa herramienta. Sin embargo, el otro día tropecé con otro
de esos proyectos que prometen búsquedas rápidas y fáciles dentro del
contenido de los ficheros, de hecho se presenta no como un recambio de
grep
, sino como un recambio de ack
. El proyecto se llama The
silver searcher y el nombre me resultó curioso. Además, encontré que
había paquete para la distro que utilizo: OpenSuse Tumbleweed y me
decidí a probarlo.
El comando utilizado es ag
y tiene una forma sencilla:
ag [opciones] patrón [path/de/búsqueda]
Lo que hará será buscar el «patrón» de forma recursiva en el path
proporcionado o en el directorio actual si no se le proporciona
ninguno. Lo de recursivo es importante, porque lo hace por defecto
en 25 directorios anidados, pero lo podemos ajustar al valor que
queramos con la opción --depth NUM
, donde -1
significa hacerlo de
manera ilimitada.
Si lo que estamos buscando son nombres de fichero, podemos utilizar la
opción -g
:
ag -g patrón
Podemos ignorar aquellos ficheros o directorios que cumplan con un
patrón con la opción --ignore PATRÓN
. También podemos decirle que
busque en un tipo determinado de archivos; por ejemplo, para buscar
sólo dentro de archivos html
utilizaremos la opción --html
. Para
obtener un listado completo de los distintos tipos de fichero que
reconoce, emplearemos el comando:
ag --list-file-types
En fin, opciones tiene muchas, así que es aconsejable mirar su página de manual para tener una idea de todas.
¿Es tan rápido como lo pintan?
Pues la sensación subjetiva, según qué búsquedas es bastante buena, no
me atrevo a decir inmediata, pero si está bien delimitada es
prácticamente así. Así que me propuse ponerlo a prueba con una
búsqueda poco acotada: tres caracteres, en varios gigas de
información. Para tener una referencia, comprobé los tiempos con
grep
y con ag
para poder comparar. Los comandos fueron:
time ag --search-binary irc ~ time grep -n -r -e "irc" ~
De primeras, los tiempos fueron muy llamativos, demasiado, entre las
ejecuciones de ag
y de grep
. Con posterioridad, esas diferencias,
aunque las hay se redujeron bastante, principalmente, cuando me di
cuenta, por ejemplo, que ag
no busca en los ficheros binarios si no
se le especifica y que grep
no muestra el número de línea si no se
le pide. Así pues, en los comandos intenté igualar, tanto la
información suministrada, como la profundidad de la búsqueda de ambos
dos comandos.
Para evitar la influencia de cachés, cada comando lo ejecuté tres veces seguidas, quedándome con el valor más pequeño de los tres. El resultado de ejecución en mi máquina y con mis «gigas» de datos, se puede apreciar en la siguiente tabla:
Tiempo | ag | grep |
---|---|---|
real | 1m44,387s | 4m0,660s |
user | 1m55,577s | 1m47,108s |
sys | 0m22,085s | 0m33,927s |
Como es obvio, más rápido sí es. La explicación que me doy, para
explicar las diferencias tan abultadas, es que ag
es multihilo y
utiliza todos los cores del procesador mientras que grep
es
monohilo y por tanto sólo utiliza uno de ellos.
Conclusiones
De momento, a pesar de su mayor velocidad, no creo que sustituya todas
mis búsquedas por ag
. Principalmente, porque la mayoría de las
veces, la búsqueda de contenidos la realizo desde Emacs para acceder
directamente a la información desde el editor y de momento, que yo
sepa, ag
no tiene soporte en este editor, mientras que se entiende
perfectamente con grep
.
De todas formas, dejo instalada la herramienta y desde línea de
comandos algunas veces la utilizaré, bien para buscar ficheros
sustituyendo a find
o bien para buscar contenidos sustituyendo a
grep
.