Cuaderno de GNUtas

Buscar contenido de archivos en Emacs con el comando grep

De un tiempo a esta parte se han puesto de moda los llamados «escritorios semánticos», donde podemos buscar contenido en todos nuestros archivos de una forma instantánea. De hecho, basta con pulsar un atajo de teclado, comenzar a escribir y ya casi al momento el sistema nos comienza a arrojar resultados. Claro que toda esta magia lleva su lado oscuro, pues se necesita tener el contenido disponible indexado en una base de datos, además de actualizarlo convenientemente cada vez que haya un añadido, modificación, supresión, etc. Tal labor de vigilancia reside en un proceso que se ejecuta en segundo plano y que tiende a consumir recursos y memoria, muchas veces de forma absurda e innecesaria, como es el caso del indexador Baloo en el escritorio Plasma. Soy un feliz y entusiasta usuario de Plasma, pero me temo que el bueno de Baloo no se cuenta entre las muchas bondades del escritorio que nos regala la comunidad KDE. No puedo con Baloo. Por mucho que lo limito, por mucho que lo procuro mantener a raya, siempre hay un momento (y generalmente el más inoportuno) en que se desmadra y se vuelve loco. Así que fuera Baloo: desactivado siempre.

Bien, matamos a Baloo, ganamos en salud; pero entonces, ¿nos quedamos también sin nuestra bonita búsqueda semántica? En realidad yo apenas echo mano de ella, y si alguna vez necesito buscar cierto contenido en mis archivos, me doy cuenta al final de que, casi en un noventa por ciento, ese contenido está en ficheros de texto plano: documentos de Org o de Markdown para mis escritos, notas y traducciones; o documentos de TeX / LaTeX para mis trabajos en composición tipográfica y producción editorial. Eso sin mencionar todo un grupo misceláneo de scripts en Bash, Python, Lua, Perl, etc. En suma: texto puro y simple. Nada de documentos de Word, ni de LibreOffice ni cosa parecida. Por tanto, para esos menesteres no hay como tirar del maravilloso comando grep de nuestra terminal. Es más (y ya que un servidor casi nunca sale de allí), podemos también usar el modo Grep de Emacs, que es muy sencillo y cuyo uso más elemental paso a describir a continuación.

Supongamos que estamos confortablemente en Emacs, y que queremos buscar, dentro de todos los documentos de texto de nuestro presente directorio, la expresión «Telémaco». Pues tecleamos el atajo M-x grep y, acto seguido, en el búfer informativo de la parte inferior, Emacs nos ofrece la posibilidad de lanzar grep con una serie de opciones ya definidas:

grep --color -nH --null -e

Estas opciones vendrían a significar lo siguiente (para saber más de grep, siempre es bueno echarle un vistazo a las páginas de su manual):

–color
resalta la búsqueda en color
-n
indica el número de línea en que aparece la expresión buscada dentro de cada archivo
-H
imprime en el resultado el nombre completo de cada archivo
–null
Introduce el carácter ASCII NUL para evitar complicaciones cualdo el nombre del archivo tiene un corte de línea.
-e
Para indicar la expresión a buscar, que se escribe a continuación y entre comillas. Podemos usar también expresiones regulares y caracteres comodín.

Con estas opciones nos basta y nos sobra para el tipo de búsqueda que pretendemos, así que ya sólo queda completar en el búfer el comando con el término a buscar («Telémaco»: no se olviden de las comillas altas), y escribimos a continuación el directorio y el nombre del archivo. Podemos usar caracteres comodín. Por ejemplo, si queremos buscar el termino sólo en los archivos Org del presente directorio, escribiremos:

grep --color -nH --null -e "Telémaco" *org

Ojo, porque en este caso la búsqueda será sensitiva a mayúsculas y minúsculas. Si queremos que grep no distinga entre ambas, añadimos la oción -i:

grep --color -nH --null -i -e "Telémaco" *org

¿Y si queremos hacer esa búsqueda recursiva a otras carpetas y subcarpetas dentro del presente directorio? Pues añadimos la opción -r

grep --color -nH --null -i -r -e "Telémaco" *org

Pero también podemos querer que grep lleve sus pesquisas a otro directorio (y también recursivamente). Entonces sólo tenemos que indicar la ruta a dicho directorio tras la expresión a buscar:

grep --color -nH --null -i -r -e "Telémaco" /<ruta del directorio>/*org

emacs-grep.png

Publicado: 22/09/2018

Última actualización: 22/09/2018


Índice general

Acerca de...

Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.

© Juan Manuel Macías
Creado con esmero en
GNU Emacs