Contacto

Nos puedes enviar un artículo a publicar (si te fue útil, seguro que a otros también).
Nos puedes sugerir temas/profundidad de interés.
correo-e - perfil

Busquedas

Comando grep

 Comando grep en GNU / Linux

 El comando grep permite buscar un patrón de texto en un archivo (o en la entrada estándar cuando no se indica un nombre de archivo), línea por línea.
 Por defecto, grep imprime en la salida estándar (en la consola) las líneas que contienen el patrón buscado.

 La sintaxis del comando (ver el man de grep), es:

     grep [OPCIONES] PATRON [ARCHIVO...]
     grep [OPCIONES] [-e PATRON | -f ARCHIVO] [ARCHIVO...]

 Este comando tiene versiones para varios sistemas, y las diferentes versiones pueden variar sutilmente, en particular algunas opciones.
 Para las diferentes pruebas en este artículo, se usa GNU grep, y se probo en la distribución de linux Ubuntu .

 Buscar un texto / palabra dentro de un archivo.
  En su forma más simple, para buscar una palabra en un archivos hacemos:

    grep <palabra_a_buscar> <ruta_archivo_donde_buscar>

 Como ejemplo, si copiamos todo lo escrito hasta ahora en este documento, en un archivo llamado "comando_grep.txt", y queremos buscar la palabra "Linux", hacemos:

     grep Linux comando_grep.txt =>    Se obtiene una sola línea como resultado, que corresponde a la primer línea del documento.

 Si el texto a buscar contiene espacios entre caracteres, se tiene que colocar entre comillas.
     grep 'GNU grep' comando_grep.txt

  Ignorar mayúsculas y minúsculas en el texto a buscar.
   Es posible ignorar entre mayúsculas y minúsculas, con la opción "-i". Si en el ejemplo anterior hacemos:

    grep -i Linux comando_grep.txt => Ignorando las mayúsculas, ahora se obtiene 2 líneas como resultado.

  Búsqueda recursiva
   Con la opción "-r", se indica que se quiere buscar de forma recursiva, por ejemplo:
     grep -ri linux misDocumentos/* => Con este comando estamos diciendo, buscar la palabra 'linux', sin discriminar entre mayúsculas/minúsculas, en todos los archivos dentro del directorio 'misDocumentos', y sus subdirectorios.

  Opciones útiles del comando grep en linux.
   Todas las opciones son útiles, pero la siguiente lista son las opciones que normalmente yo suelo usar.

  -H Imprime el nombre del archivo en donde se encontró el patrón buscado. Es útil cuando buscamos el patrón en varios archivos o de forma recursiva.
     grep -H linux *.txt Se busca 'linux' en todos los archivos con extensión ".txt". Si hay resultados, se imprime junta a la línea, el nombre del archivo

  -n Imprime el número de línea donde se encuentra el patrón buscado. Por ejemplo, siguiendo con el archivo de ejemplo anterior, el siguiente comando:
     grep -Hn 'GNU / Linux' comando_grep.txt
tiene como resultado: " comando_grep.txt:1: Comando grep en GNU / Linux "

  Invertir la coincidencia.
  -v  En algunas oportunidades (por ejemplo al concatenar varios comandos), se puede querer que se muestre las líneas que NO coinciden con el patrón buscado, para esto se usa "-v". El siguiente comando, imprime el nombre del archivo, el número de línea y la linea donde la palabra "linux" se encuentra, pero que NO contiene en esas líneas la palabra 'ubuntu'. En ambos casos se ignora mayúsculas / minúsculas (con la opción '-i') 
    grep -Hni Linux comando_grep.txt | grep -vi ubuntu

 Imprimir líneas previas y posteriores a la de coincidencia.
  El comportamiento de grep, es imprimir las líneas que coinciden con el patrón de búsqueda. Puede ser necesario querer ver las N líneas antes o después de ésta.
  Este comportamiento es posible con las opciones:
 -B numLineas muestra los 'numLineas' luego de la línea donde se encontró la coincidencia con el patrón de búsqueda.
 -A numLineas muestra los 'numLineas' antes de la línea donde se encontró la coincidencia con el patrón de búsqueda.
 -C numLineas muestra los 'numLineas' antes y después de la línea donde se encontró la coincidencia con el patrón de búsqueda. Idem a usar -A y -B juntos

    grep -Hni -A3 -B1 Linux comando_grep.txt
    grep -Hni -C2 Linux comando_grep.txt == grep -Hni -A2 -B2 Linux comando_grep.txt

 -w  Hace que la coincidencia del texto corresponda a una palabra. por ejemplo, si buscamos: 
    grep -w -i inux comando_grep.txt No se obtienen coincidencias (si se elimina el '-w' si hay resultados), ya que no hay ninguna palabra 'inux'(es parte de una palabra)
    grep -w -i linux comando_grep.txt Se encuentran coincidencias.

 Ingreso de expresiones regulares con grep 
 -E De esta forma, grep interpreta el patrón ingresado, como una expresión. Ya se subirá un doc para explicar las expresiones regulares, mientras, algunos ejemplos.
  Las opciones anteriores siguen siendo válidos junto con '-E' (-i, -w, etc).

    grep -E 'linux|gnu' comando_grep.txt  Como expresión regular, el símbolo '|' es equivalente a un 'OR'. En este comando obtenemos las líneas que tienen el texto linux o gnu. Podemos indicar como antes, que ignore mayúsculas y minúsculas: grep -i -E 'linux|gnu' comando_grep.txt
    grep -w -E '(linu|uni)x' comando_grep.txt Se puede usar parentesis '()' para agrupar caracteres.

    echo -e "esto es una prueb123aaa \n esto es otra pruebaaaaa" | grep -w -E 'prueb[1-9]+a{2,7}'

  En este ejemplo, se esta buscando una palabra ('-w') que comienza con 'prueb', continua con un dígito entre '1 a 9' que se encuentra 1 o más veces ('+'), luego sigue con la letra 'a' la cual tiene que estar repetida como mínimo 2 veces y un máximo de 7 ('a{2,7}')
   Ver que en este caso no buscamos el patrón dentro de un archivo de texto, sino que se toma la salida del comando 'echo'

 Concatenar flujos - concatenar busquedas grep

  Dado que se uso en varios ejemplos, pero hasta ahora no se había explicado, esta nota final (que es independiente de grep).

  Podemos concatenar comandos utilizando el simbolo de 'pipeline' ( | ). Lo que se hace con este símbolo es agregar la salida de un comando, como la entrada de datos al comando siguiente.

  De esta forma, podemos concatenar varias búsquedas grep.
  En el articulo vimos un par de ejmplos, como ser el concatener patrones de busqueda por medio de dos comandos grep:

     grep -Hni Linux comando_grep.txt | grep -vi ubuntu 

 Al concatenar 2 comandos grep, el segundo comando (en este caso 'grep -vi ubuntu') filtra sobro los resultados generados por el primer comando.

   En el último ejemplo que se había usado, se concateno el camando "echo" con el grep. Con 'echo...' se genera el texto ("esto es una prueba123aaa ...") que se usa para la búsqueda de grep .

   No se tiene que confundir el uso de '|' para concatenar comandos, al usado en grep para indicar el "OR" entre dos textos o caracteres (en una expresión regular).

No hay comentarios: