Ejemplos de grep: opciones útiles para shell scripts

Cuando presentamos el tema de expresiones regulares, comenzamos utilizando grep. En ese momento mostramos cómo utilizar esta herramienta manualmente desde la línea de comandos. Sin embargo, su uso más común consiste en incluirla dentro de shell scripts. Por eso, en este post compartiremos algunos ejemplos de grep que nos serán más útiles en dicha tarea.

Ejemplos de grep

Ya sabemos que grep nos permite encontrar ocurrencias de un patrón dado en una serie de archivos. Por ejemplo,

grep -ir documentroot /etc/httpd/conf/*

nos indicará cada aparición de documentroot (sin tener en cuenta mayúsculas o minúsculas) en todos los archivos contenidos dentro de /etc/httpd/conf.

Sin embargo, si un archivo dado contiene más de una ocurrencia del patrón de búsqueda el resultado devolverá todas. Para que la búsqueda regrese solamente el nombre del archivo donde se detectó la presencia del patrón debemos hacer la siguiente modificación. Al utilizar la opción -l obtendremos el resultado deseado (ver Fig. 1):

Ejemplos de grep: utilización de la opción -l
Figura 1 – Ejemplos de grep: utilización de la opción -l

Cuando ejecutamos el comando anterior veremos que se nos devuelve el resultado por pantalla. En este caso se trata del nombre del archivo donde se encontró la coincidencia. Sin embargo, al ejecutar un shell script (a menudo de manera automática a través de cron) no nos interesará mostrar nada por pantalla. Más bien, querremos redireccionar el resultado a un archivo (no ejemplificado en este post) o tomar alguna otra acción.

Uso en shell scripts

Para evitar que grep nos devuelva resultado por pantalla deberemos agregar la opción -q (quiet). Posteriormente podremos saber si la búsqueda generó algún resultado o no utilizando $?, expresión que nos devuelve el resultado de la ejecución del último comando ingresado. Si $? es igual a 0, el último comando se ejecutó exitosamente; de otra manera, algo falló (o en este caso, no hubo resultados).

El siguiente script muestra en pantalla el nombre del archivo donde se encontró el patrón de búsqueda dentro de un directorio. Si no hubo coincidencias, también lo indicará. Tanto el patrón de búsqueda como el directorio son ingresados al script usogrep.sh como argumentos ($1 y $2 respectivamente).

#!/bin/bash

# Patrón de búsqueda
PATRON=$1

# Directorio en donde buscar
DIRECTORIO=$2

# Búsqueda
grep -irq $PATRON $DIRECTORIO/*

if [ $? -eq 0 ]; then
    LUGAR=$(grep -irl $PATRON $DIRECTORIO/*)
    echo "El patrón $PATRON fue localizado en $LUGAR."
else
    echo "No se encontró el patrón $PATRON en los archivos presentes dentro de $DIRECTORIO."
fi
Ejemplos de grep: uso en scripts
Figura 2 – Ejemplos de grep: uso en scripts

Espero que les sirva. ¡Nos leemos en breve!