Comando grep

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!