Notxor tiene un blog

Defenestrando la vida


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:

Tabla 1 Tabla de tiempos de búsqueda según muestra el comando time.
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.


Comentarios

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, he decidido no proporcionar dicha opción en el Blog. Si alguien quiere comentar algo, me puede encontrar en Mastodon y en Diaspora con el nick de Notxor.

También se ha abierto un grupo en Telegram, para usuarios de esa red.

Disculpen las molestias.