Este será un artículo práctico, en el que pondré algunos ejemplos de cómo encontrar archivos que contienen una cadena de texto determinada.
A mi me pasa en muchas ocasiones, intentar encontrar en qué lugar de una aplicación (su código fuente) hay una cadena de texto concreta – ya sea la definición de una constante o una palabra clave que en algún momento puse – resulta en ocasiones más que entretenido.
Es cierto que si utilizas frameworks como Eclipse o similares, estas opciones suelen venir integradas de manera más o menos sencillas, pero trabajando desde un terminal, la cosa cambia.
El comando que nos permitirá realizar una búsqueda de una cadena de texto dentro de uno o más ficheros o incluso toda una estructura de directorios, es grep.
A continuación aquí van algunos ejemplos básicos y muy habituales:
pedro@pedro-laptop:/home/pedro$ cat catalina.out | grep UPDATE
o también
pedro@pedro-laptop:/home/pedro$ grep UPDATE catalina.out
Estos dos comandos hacen lo mismo, muestra por pantalla todas las líneas que contengan la palabra UPDATE dentro del fichero catalina.out.
pedro@pedro-laptop:/home/pedro$ tail -f /var/log/syslog | grep usb
pedro@pedro-laptop:/home/pedro$ tail -f /var/log/apache2/access.log |grep web_concreta.html
Así podremos ver en tiempo real qué dispositivos usb se conectan y desconectan al PC o cuando se está accediendo a una web_concreta.html en Apache, respectivamente.
Si lo que necesitamos es buscar de manera recursiva en la estructura de directorios, basta con usar la opción -r:
pedro@pedro-laptop:/home/pedro$ grep -r UPDATE /path/to/dir
También podemos mostrar el archivo que contiene la cadena que estamos buscando, en vez de mostrar sólo el contenido del fichero:
pedro@pedro-laptop:/home/pedro$ grep -H -r usb /var/log/
El anterior comando muestra los archivos y la linea que contiene usb dentro de /var/log y todos sus subdirectorios.
Si lo que necesitamos es mostrar únicamente el fichero sin mostrar el contenido, también es posible:
pedro@pedro-laptop:/home/pedro$ grep -lr usb /var/log/
Si sabemos el nombre o la extensión del archivo que estamos buscando podemos acotar más la búsqueda, ejecutando el siguiente comando:
pedro@pedro-laptop:/home/pedro$ grep -Hr hidden /ruta/a/directorio |grep nombre_de_archivo
Esto nos mostrará todos los ficheros llamados nombre_de_archivo que se encuentran dentro de /ruta/a/directorio y que contienen hidden.
Si lo que necesitas es encontrar la cadena de texto -r, puedes usar las comillas dobles:
pedro@pedro-laptop:/home/pedro$ grep -H -r «-r» /var/log/
Cabe recordar que si el resultado del comando es un listado demasiado largo, tenemos la opción de añadir al final de cualquiera de los anteriores comandos | more que nos permitirá paginar los resultados encontrados, o bien añadir también al final > resultados.txt para generar un fichero de texto con los resultados obtenidos. Añadiendo >> resultados.txt, añadiremos los resultados al final del fichero.
Un saludo!