Icono de búsqueda de texto

El comando grep

 
 

En este artículo aprenderemos a usar el comando grep. No es una guía completa, pero veremos las opciones más utilizadas de la herramienta y ejemplos útiles.

 
Índice General

  1. Introducción
  2. Sintaxis, opciones y expresiones regulares más utilizadas
  3. Ejemplos útiles

 

  1. Introducción (Volver al índice General)
    El comando grep es una potente herramienta de búsqueda de texto, que se ejecuta desde la interfaz de línea de comandos (CLI). Se desarrolló para ser utilizado en sistemas UNIX, pero hoy día, es de uso casi obligatorio en sistemas GNU/Linux, sobre todo en equipos que carecen de interfaz gráfica, como suele ocurrir en equipos con el rol de servidor. Su desarrollo sigue la filosofía modular de UNIX, es decir, crear pequeños programas altamente especializados en una sola cosa, para luego utilizarlos combinados por medio de tuberías. Algunos de los programas utilizados en combinación con grep son cat, less, tail, ps, netstat, cut, etc, aunque es capaz de buscar en la salida de cualquier programa.

    grep busca patrones que definimos (utilizando expresiones regulares) en archivos de texto, directorios y subdirectorios o en la salida de otros comandos (entrada estándar, stdin) mediante tuberías, e imprime la línea o líneas que contenga dichos patrones.

  2.  

  3. Sintaxis, opciones y expresiones regulares más utilizadas (Volver al índice General)
       

    • Sintaxis (Volver al índice General)
      La sintaxis de grep es la siguiente:

      $ grep [OPCIONES] PATRONES [ARCHIVO ...]
      $ grep [OPCIONES] -e PATRONES ... [ARCHIVO ...]
      $ grep [OPCIONES] -f ARCHIVO-DE-PATRONES ... [ARCHIVO ...]

      Hay cuatro grandes variantes de grep, controladas por las siguientes opciones:

      • -G, --basic-regexp : Interpreta el patrón como una expresión regular básica. Éste es el comportamiento predeterminado.
      • -E, --extended-regexp : Interpreta el patrón como una expresión regular extendida.
      • -F, --fixed-strings: Interpreta el patrón como una lista de cadenas de caracteres fijas, separadas por saltos de línea; se busca la concordancia de una cualquiera de ellas.
      • -P, --perl-regexp: Interpreta el patrón como expresiones regulares compatibles con Perl.

       
      Además, están disponibles tres programas variantes de grep que son:

      • egrep : Similar (pero no idéntico) a grep −E.
      • fgrep : Es lo mismo que grep −F.
      • rgrep : Es lo mismo que grep −r.

      Estas variantes están obsoletas, pero se proporcionan por compatibilidad con versiones anteriores.

    •  

    • Las opciones (Volver al índice General)
      Las opciones más comunes son:

      • -e PATRONES, --regexp=PATRONES : Emplea PATRONES como el patrón de búsqueda. Si esta opción se usa múltiples veces o combinada con la opción -f (--file), busca por todos los patrones dados. Útil para proteger patrones que comiencen con .
      • -f ARCHIVO-DE-PATRONES, --file=ARCHIVO-DE-PATRONES : Obtiene los patrones de ARCHIVO-DE-PATRONES. En ARCHIVO-DE-PATRONES se indicarán los patrones de búsqueda uno por línea. Si esta opción se usa múltiples veces o se combina con la opción -e (--regexp), busca por todos los patrones dados.
      • -i, --ignore-case : La búsqueda no distinguirá entre mayúsculas y minúsculas.
      • -v, --invert-match : Con esta opción, se nos muestran las líneas que no coinciden con el patrón que hemos buscado.
      • -w, --word-regexp : Selecciona solamente aquellas líneas que contienen concordancias que forman palabras completas. La comprobación consiste en que la cadena de caracteres concordante debe estar al principio de la línea o precedida por un carácter que no forme parte de una palabra. De forma similar, debe estar o al final de la línea o ser seguida por un carácter no constituyente de palabra. Los caracteres que se consideran como parte de palabras son letras, dígitos y el subrayado.
      • -x, --line-regexp : Seleccione solo aquellas coincidencias que coincidan exactamente con toda la línea. Para un patrón de expresión regular, esto es como poner entre paréntesis el patrón y luego rodearlo con ^ y $.
      • -c, --count : Solo mostrará el número de líneas que coinciden con el patrón buscado.
      • -n, --line-number : Prefija cada línea de salida con el número de línea de su fichero de entrada correspondiente.
      • -d ACCIÓN, --directories=ACCIÓN : Si se pasa un directorio como argumento, usará ACTION para procesarlo. Por defecto, ACTION es read, es decir, lee directorios como si fueran archivos normales. Si ACCIÓN es skip, salta los directorios silenciosamente. Si ACTION es recurse, lee todos los archivos en cada directorio de forma recursiva, siguiendo enlaces simbólicos solo si están en la línea de comando. Esto es equivalente a la opción -r.
      • -r, --recursive : Lee todos los archivos de cada directorio de forma recursiva. Sigue enlaces simbólicos solo si están en la línea de comando. Si no se proporciona como parámetro ARCHIVO, grep buscará en el directorio de trabajo. Esto es equivalente a la opción -d recurse.
      • -R, --dereference-recursive : Lee todos los archivos de cada directorio, de forma recursiva. Sigue todos los enlaces simbólicos, a diferencia de la opción -r.
    •  

    • Expresiones regulares más utilizadas (Volver al índice General)
      En este artículo trabajaremos con las siguientes expresiones regulares, pero hay muchas más:

      • El punto «.» : Se interpreta como cualquier carácter.
      • El signo de interrogación «?» : El signo de interrogación tiene varias funciones dentro del lenguaje de las expresiones regulares. La primera de ellas es especificar que una parte de la búsqueda es opcional. Por ejemplo, la expresión regular «ob?scuridad» permite encontrar tanto «oscuridad» como «obscuridad».
      • El acento circunflejo «^» : Representa el inicio de la cadena. Por ejemplo la expresión regular ^[0-9] busca todos los párrafos que comiencen con un número.
      • El símbolo dólar «$» : Representa el final de la cadena de caracteres o el final de la línea. No representa un carácter en especial sino una posición.
      • La barra inversa «\» : Se utiliza para escapar el siguiente carácter de la expresión de búsqueda de forma que este adquiera un significado especial o deje de tenerlo. Nunca se utiliza por si sola, siempre en combinación con otros caracteres.
      • La barra «|» : Sirve para indicar una de varias opciones. Por ejemplo, la expresión regular blanco|negro encontrará dentro del texto las palabras «blanco» o «negro».
      • La función corchetes «[]» : Agrupa caracteres en grupos. Utiles para buscar uno de un grupo de caracteres. Por ejemplo, [0123456789] o [0-9] bucaría en la cadena cualquier número entre el 0 y el 9. Otro ejemplo, expresi[oó]n nos permite buscar la palabra «expresión» o «expresión». Dentro de los corchetes todos los caracteres adquieren su valor literal, el punto es un punto y no un comodín. El único carácter que hay que anteceder con la barra inversa «\» es la propia barra inversa.
      • Las llaves «{}» : Comúnmente las llaves son caracteres literales cuando se utilizan por separado en una expresión regular. Para que adquieran su función de metacaracteres es necesario que encierren uno o varios números separados por coma y que estén colocados a la derecha de otra expresión regular, por ejemplo, [0-9]{2} esta expresión le dice al motor de búsqueda que encuentre dos dígitos contiguos.

  4.  
     
     

  5. Ejemplos útiles (Volver al índice General)
       

    • Buscando en archivos (Volver al índice General)
      En los siguientes ejemplos hemos utilizado un archivo de texto con el siguiente contenido:

      1. primera línea. Mortadelo
      2. segunda línea
      Tercera línea.
      cuarta línea.
      31/12/2021
      12:00:00
      7. séptima linea. mortadelo
      La casa
      La cosa
      La cisterna
      oscuridad
      obscuridad

      A dicho archivo le hemos asignado el nombre de prueba.txt.

         

      • Busqueda sin distinguir mayúsculas y minúsculas (Volver al índice General)
        En este ejemplo buscaremos un patrón utilizando la opción -i para que la búsqueda no discrimine entre palabras en mayúsculas y minúsculas:

        $ grep -i mortadelo prueba.txt
        1. primera línea. Mortadelo
        7. séptima linea. mortadelo

        Obtenemos las líneas que contienen la palabra Mortadelo y mortadelo. Si no utilizamos la opción -i, obtendríamos como salida la última línea en la que aparece mortadelo en minúsculas.

      •  

      • Buscar líneas que empiecen por un patrón (Volver al índice General)
        Para indicar a grep que ha de buscar líneas que comienzan por un patrón dado, deberemos emplear la expresión regular acento circunflejo «^». Además nos ayudaremos de la función corchetes «[]» para agrupar caracteres.

        Por ejemplo, busquemos líneas que comienzan con un número:

        $ grep ^[0-9] prueba.txt 
        1. primera línea. Mortadelo
        2. segunda línea
        7. séptima linea. mortadelo

        Busquemos ahora líneas que empiezan por una letra, ya sea mayúscula o minúscula:

        $ grep ^[a-zA-Z] prueba.txt
        Tercera línea.
        cuarta línea.
        La casa
        La cosa
        La cisterna
        oscuridad
        obscuridad
      •  

      • Buscar líneas que empiecen por varios patrones(Volver al índice General)
        Busquemos las líneas que empiecen por la letra o o la letra T. En este ejemplo tendremos que activar la opción -E para que interprete expresiones regulares extendidas ya que vamos a utilizar el símbolo barra «|»:

        $ grep -E ^o\|^T prueba.txt 
        Tercera línea.
        oscuridad
        obscuridad

        Hemos tenido que anteponer la barra inversa «\» para que el símbolo de la barra «|» adquiera su significado especial y deje de tener su significado literal.

      •  

      • Buscar lineas que contengas alguna de las palabras del patrón (Volver al índice General)
        En este ejemplo pediremos a grep que nos muestre aquellas líneas que contengan alguna de las tres palabras que forman el patrón:

        $ grep -E casa\|cosa\|cisterna prueba.txt
        La casa
        La cosa
        La cisterna

        Seguimos utilizando la opción -E y anteponiendo la barra inversa «\» para que el símbolo de la barra «|» adquiera su significado especial y deje de tener su significado literal.

      •  

      • Buscar una palabra exacta (Volver al índice General)
        Para buscar palabras exactas utilizaremos la opción -w. En este ejemplo buscaremos la palabra línea:

        $ grep -w línea prueba.txt 
        1. primera línea. Mortadelo
        2. segunda línea
        Tercera línea.
        cuarta línea.

        No olvidemos que -w selecciona solamente aquellas líneas que contienen concordancias que forman palabras completas. La comprobación consiste en que la cadena de caracteres concordante debe estar al principio de la línea o precedida por un carácter que no forme parte de una palabra. De forma similar, debe estar o al final de la línea o ser seguida por un carácter no constituyente de palabra. Los caracteres que se consideran como parte de palabras son letras, dígitos y el subrayado

      •  

      • Buscar palabras acentuadas y no acentuadas (Volver al índice General)
        En el ejemplo anterior hemos buscado líneas que contienen la palabra línea, pero en el archivo prueba.txt hay varias erratas. Busquemos la misma palabra acentuada y no acentuada:

        $ grep l[]nea prueba.txt
        1. primera línea. Mortadelo
        2. segunda línea
        Tercera línea.
        cuarta línea.
        7. séptima linea. mortadelo
      •  

      • Utilizando el comodín punto (.) (Volver al índice General)
        Recordemos que el símbolo punto «.» se interpreta como cualquier carácter. En este ejemplo buscaremos palabras que contengan la letra c, seguida de cualquier carácter y a continuación, de la letra s:

        $ grep c.s prueba.txt 
        La casa
        La cosa
        La cisterna
      •  

      • Contar las líneas en las que aparece el patrón (Volver al índice General)
        Utilizaremos el patrón del ejemplo anterior y añadiremos la opción -c para pedirle a grep que cuente el número de líneas en el que aparece el patrón:

        $ grep -c c.s prueba.txt 
        3

        La salida nos indica que en 3 líneas se encuentra el patrón indicado.

      •  

      • Mostrar el número de la línea en la que aparece el patrón (Volver al índice General)
        Volvemos a utilizar el patrón del ejemplo anterior pero utilizaremos la opción -n que antepondrá a la línea el número de orden dentro del fichero prueba.txt:

        $ grep -n c.s prueba.txt 
        8:La casa
        9:La cosa
        10:La cisterna
      •  

      • Buscar líneas que terminan con una palabra (Volver al índice General)
        En este ejemplo buscaremos las líneas que terminan con la palabra línea. Para hacerlo, utilizaremos la expresión regular símbolo dolar «$»:

        $ grep línea$ prueba.txt
        2. segunda línea
      •  

      • Buscar líneas que terminan con un punto (Volver al índice General)
        Este ejemplo es interesante ya que el punto «.» forma parte de las expresiones regulares, es el comodín que se interpreta como cualquier carácter. Por lo tanto tendremos que utilizar en el patrón alguna expresión que indique el significado literal del punto «.» y no su significado especial:

        $ grep \\.$ prueba.txt 
        Tercera línea.
        cuarta línea.

        Hemos utilizado una barra invertida «\» para cambiar el valor literal por el valor especial de la siguiente barra inventida «\», la cual dotará de valor literál al punto «.».

      •  

      • Especificar que parte de la búsqueda es opcional (Volver al índice General)
        En estos ejemplos utilizaremos la expresión regular signo de interrogación «?», la cual nos permitirá especificar que parte de la búsqueda es opcional:

        $ grep ca\\?o\\?sa prueba.txt
        La casa
        La cosa

        Veamos otro ejemplo:

        $ grep ob\\?scuridad prueba.txt
        oscuridad
        obscuridad

        El carácter delante de la expresión \\? es opcional.


      •  
         
         

      • Buscar una fecha (Volver al índice General)
        Hay otras formas de hacerlo pero veremos la más fácil de entender. En este caso utilizaremos las expresiones regulares función corchetes «[]», que ya hemos visto en ejemplos anteriores y la función llaves «{}», que nos ayudará a indicar el número de caracteres contiguos:

        $ grep -E [0-9]{2}/[0-9]{2}/[0-9]{4} prueba.txt
        31/12/2021
      •  

      • Buscar una hora (Volver al índice General)
        Muy parecido al anterior, solo cambiaremos algunos signos de puntuación:

        $ grep -E [0-9]{2}:[0-9]{2}:[0-9]{2} prueba.txt
        12:00:00
    •  

    • Buscando en directorios (Volver al índice General)
      Con el comando grep podemos hacer búsquedas de patrones en todos los archivos ubicados en un directorio. Si en vez de pasar como parámetro un archivo, pasamos como parámetro la rutra de un directorio, grep buscará en todos los archivos de dicho directorio. Si no pasamos como parámetro archivo o directorio, grep buscará en todos los archivos del directorio de trabajo o actual. Además con las opciones -r, --recursive o -R, --dereference-recursive, grep leerá todos los archivos de cada directorio, de forma recursiva.

      Para los siguientes ejemplos, supongamos que en nuestro directorio personal (home) tenemos la siguiente estructura de directorios y archivos:

      $ tree /home/miusuario/temporal/
      /home/miusuario/temporal/
      ├── prueba.txt
      └── temp2
          └── prueba2.txt
         

      • Buscar en un directorio (Volver al índice General)
        Buscaremos en archivos de un directorio y no en los archivos de los subdirectorios si los hubiese. Por ejemplo, con la siguiente orden solo buscaría en los archivos del directorio /home/miusuario/temporal/, no buscaría recursivamente:

        $ grep -i -d skip mortadelo /home/miusuario/temporal/*
        /home/miusuario/temporal/prueba.txt:1. primera línea. Mortadelo
        /home/miusuario/temporal/prueba.txt:7. séptima linea. mortadelo
      •  

      • Buscar recursivamente en un directorio (Volver al índice General)
        Buscaremos en archivos de un directorio y en los archivos de los subdirectorios si los hubiese. Por ejemplo, con la siguiente orden buscaría en los archivos del directorio /home/miusuario/temporal/ y en el subdirectorio temp2:

        $ grep -ir mortadelo /home/miusuario/temporal/
        /home/miusuario/temporal/prueba.txt:1. primera línea. Mortadelo
        /home/miusuario/temporal/prueba.txt:7. séptima linea. mortadelo
        /home/miusuario/temporal/temp2/prueba2.txt:1. primera línea. Mortadelo
        /home/miusuario/temporal/temp2/prueba2.txt:7. séptima linea. mortadelo

        La siguiente orden es igual a la anterior:

        $ grep -id recurse  mortadelo /home/karfer/temporal/
        /home/karfer/temporal/prueba.txt:1. primera línea. Mortadelo
        /home/karfer/temporal/prueba.txt:7. séptima linea. mortadelo
        /home/karfer/temporal/temp2/prueba2.txt:1. primera línea. Mortadelo
        /home/karfer/temporal/temp2/prueba2.txt:7. séptima linea. mortadelo

        En el modo recursivo, si omitimos el parámetro ARCHIVO indicado en su sintaxis, grep buscará recursivamente en el directorio de trabajo o actual:

        $ pwd
        /home/miusuario/temporal

        Si nos encontramos en el directorio temporal y ejecutamos la siguiente orden, obtendremos el mismo resultado de búsqueda que en el ejemplo anterior:

        $ grep -ir mortadelo
        prueba.txt:1. primera línea. Mortadelo
        prueba.txt:7. séptima linea. mortadelo
        temp2/prueba2.txt:1. primera línea. Mortadelo
        temp2/prueba2.txt:7. séptima linea. mortadelo

        La única diferencia es que no especifica el directorio de trabajo o actual.

        La siguiente orden es igual a la anterior:

        $ grep -id recurse  mortadelo
        prueba.txt:1. primera línea. Mortadelo
        prueba.txt:7. séptima linea. mortadelo
        temp2/prueba2.txt:1. primera línea. Mortadelo
        temp2/prueba2.txt:7. séptima linea. mortadelo
    •  

    • Utilizando tuberías (Volver al índice General)
      Como ya hemos dicho al principio del artículo, grep fue desarrollado siguiendo la filosofía modular de UNIX, es decir, crear pequeños programas altamente especializados en una sola cosa, para luego utilizarlos combinados por medio de tuberías. A continuación veremos un ejemplo simple de como filtrar la salida del cumando cut con grep.

      En el siguiente ejemplo, con el comando cut mostraremos los valores de los campos 1 y 5 de cada una de las líneas del archivo /etc/passwd y utilizando una tubería, buscaremos en la salida del comando cut aquellas líneas que empiezan por las letras ana:

      $ cut -d ":" -f 1,5 /etc/passwd |grep ^ana
      anacleto:Agente Secreto,,,

 

Espero que este artículo os haya sido de utilidad. Si pensáis que podéis colaborar para mejorar este artículo, que hay algo erróneo en él o simplemente deseáis comentarlo, por favor, dejad vuestra opinión más abajo.
 
Seguir J. Carlos:

Técnico Informático - Desarrollo Web - Administración de Redes

Técnico Informático. Desarrollo Web. Administración de redes.

Últimas publicaciones de

2 comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.