Buscar cadenas de texto de manera eficiente en linux con find, xargs y grep

Como ya vimos en el post de comandos útiles para trabajar en linux, grep es el comando por excelencia para buscar cadenas de textos en archivos.

Sin embargo una búsqueda con grep puede hacerse muy pesada cuando la hacemos de manera recursiva en carpetas con multitud de archivos.

Por ello una manera de controlar la búsqueda es indicarle un patrón sobre los archivos que queramos hacer el grep. Esto se puede hacer usando una expresión regular (RegEx) en la ruta de búsqueda de grep.

grep "potencia" /datos/coches/*/caracteristicas.txt

Esto buscará la cadena potencia en todos los archivos caracteristicas.txt que existan dentro de las carpetas existentes en /datos/coches/.

Sin embargo este método puede ser un problema si tenemos el archivos caracteristicas.txt en rutas totalmente diferentes.

Para buscar archivos existe el comando find con el que podríamos encontrar todas las rutas donde se ubican los archivos caracteristicas.txt.

find / -name “caracteristicas.txt”

Esto nos sacará por pantalla la ubicación de todos los archivos caracteristicas.txt.

Para combinar estas dos acciones se puede usar el comando xargs que es capaz de ejecutar un comando sobre los resultados obtenidos por la salida estándar. Esto quiere decir que en combinación con grep, ejecutará el comando sobre los resultados de find. Por ejemplo si ejecutamos:

find / -name “caracteristicas.txt” | xargs grep “potencia”

Primero se ejecutará un find en toda la máquina en busca de archivos con nombre caracteristicas.txt. Una vez finalice la ejecución, y gracias a xargs, el comando grep se ejecutará únicamente sobre los resultados obtenidos por el comando find.

De este modo se evita que grep recorra todos los archivos de la máquina en búsqueda de la cadena potencia con lo que se consigue una búsqueda mucho más eficiente.