egrep: ejemplos del comando en GNU/Linux

egrep

grep es una de las herramientas más usadas en la línea de comandos de GNU/Linux. A pesar de ser una herramienta muy simple, permite realizar gran cantidad de operaciones. Se usa especialmente junto con las tuberías, para poder localizar puntos concretos en la salida de un comando previo, etc. Pero también existe una herramienta conocida como egrep que equivale a ejecutar grep con la opción -E.

La e proviene de «Extended regex», que es lo que activa la opción -E y lo que tienes en egrep por defecto sin necesidad de usar esa opción. Es decir, que podrás usar las expresiones regulares extendidas. En este tutorial no entraré en explicar qué son las expresiones regulares, cómo se pueden usar y qué tipos hay en los *nix. Simplemente mostraré ejemplos prácticos de algunas cosas útiles que puedes hacer con egrep…

grep, egrep, y fgrep son similares. De hecho, egrep equivale a grep -E y fgrep equivale a grep -F. Es decir, en el caso que nos concierne, va a interpretar los patrones también como expresiones regulares.

Puedes buscar una línea o palabra concreta en uno o varios archivos, como también sucede con grep. Por ejemplo, imagina que quieres buscar la palabra ubuntu en un fichero llamado snap.txt y también en todos los .txt del directorio actual:

egrep ubuntu snap.txt

egrep ubuntu *.txt

La búsqueda puede ser también recursiva para buscar en todo el contenido del directorio actual:

egrep -r "hola mundo" *

Hasta aquí se buscaban palabras o cadenas exactas, es decir, teniendo en cuenta mayúsculas y minúsculas (case-sensitive), pero si quieres hacerlo en modo case-insensitive, sin importar si son mayúculas o minúsculas, puedes usar lo siguiente (si agregas w busca solo coincidencias completas):

egrep -i "ejemplo" documento.txt

egrep -iw "ejemplo" documento.txt

Mostrar, no las coincidencias, sino los nombres de archivos donde se han encontrado esas coincidencias:

egrep -l hola *.txt

Mostrar solo el patrón o palabra buscada dentro de un documento:

egrep -o printf hola.c

Recuerda que puedes usar todas las posibilidades que imagines. Puedes combinar varias de las opciones vistas anteriormente, o las puedes complementar con otras opciones como -A n y -B n, siendo n el número de líneas que quieres mostrar antes (Before) y después (After) de la coincidencia o ambas a la vez (C), para que así puedas ver lo que rodea a dicha coincidencia:

egrep -A 2 "printf" hola.c

egrep -B 2 "printf" hola.c

egrep -C 2 printf hola.c

Suprimir las líneas que contienen una coincidencia y solo mostrar las que no coinciden:

egrep -v "dos" números.doc

O si lo prefieres, puedes usar varias palabras o coincidencias con -e. Por ejemplo:

egrep -v -e "uno" -e "dos" -e "tres" números.txt

Si usas -c se pueden solo contar el número de coincidencias, o invertirlo con -v para que muestre el número de líneas no coincidentes. Por ejemplo:

egrep -c "include" main.c

egrep -v -c "include" main.c

E incluso mostrar el número de línea donde se ha producido la coincidencia, y también la posición que ocupa respectivamente:

egrep -n "void" hola.c

egrep -o -b "printf" hola.c

Y junto con las expresiones regulares se pueden ampliar sus capacidades. Por ejemplo, buscar una línea que comience por Hola y termine por adios, o que comience por Hola seguida de lo que sea y luego aparezca la coincidencia adiós respectivamente:

*Corrección del siguiente comando: gracias al comentario del lector Manuel Alcocer he podido modificar el siguiente comando, puesto que había un error.

egrep '^Hola.*adiós$' ejemplo.txt

egrep "Hola.*adiós" ejemplo.txt

Pero si te preguntas por la diferencia con grep, aquí tienes un ejemplo que te lo dejará claro… En el caso de usar grep sin -E deberías usar las secuencias de escape para que interprete los caracteres especiales como tales, ya que de lo contrario interpretaría el patrón como tal sin tenerlos en cuenta. En cambio, con egrep o grep -E sí que los va a tener en cuenta. Por ejemplo:
grep '^no\(fork\|group\)' /etc/group

Eso sería equivalente a:

grep -E '^no(fork|group)' /etc/group
egrep '^no(fork|group)' /etc/group

Es decir, buscaría las líneas que coinciden comienzan por nofork o nogroup. Pero si usases la expresión primera de grep sin las secuencias de escape, lo que haría es buscar el patrón concreto no(fork|group):

grep 'no(fork|group)' /etc/group

Puedes también buscar rangos alfanuméricos, o valores concretos, como por ejemplo para localizar ciertas IPs:
cat /etc/networks | egrep "192.168.1.[5-9]"
cat /etc/networks | egrep "192.168.[1-3].[5-9]"
cat /etc/networks | egrep "192.168.1.[0-3]|[5-9]"
egrep 192.168.4.[10,40] networks

Si lo prefieres, puedes usar otras expresiones regulares para hacer búsquedas más concretas. Por ejemplo | para buscar una coincidencia o la otra:

egrep -i '^(printf|scanf)' hola.c

Incluso puedes localizar mayúsculas, minúsculas, caracteres alfabéticos solo, o alfanuméricos, etc., usando otras expresiones como: [:alnum:], [:alpha:], [:digit:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], etc. Por ejemplo, para buscar mayúsculas:
egrep [[:upper:]] diccioario

Espero que te ayude… Próximamente explicaré las expresiones regulares en un artículo dedicado especialmente a ello…


Deja tu comentario

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

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   Manuel Alcocer dijo

    Buenas tardes.

    Unas puntualizaciones…

    Explicáis el comando ‘egrep’ pero no ponéis la diferencia entre ‘egrep’ y ‘grep’, que debería ser de lo que se tratase aquí.

    Por ejemplo:
    Con grep: ip -4 a | grep ‘[0-9]\+’
    Con egrep: ip -4 a | egrep ‘[0-9]+’

    Ahh, y esto está mal, ‘egrep «Hola.*adios» ejemplo.txt’; el acierto aquí se produce cuando en el fichero haya alguna línea que contenga la cadena ‘Hola’ seguido de lo que sea y seguido de ‘adios’, realmente la línea puede empezar y terminar por lo que sea.

    Esto sí sería lo que dice el artículo:
    egrep ‘^Hola.*adios$’ ejemplo.txt

    Y todas las opciones, o casi todas (no me paro a comprobarlo), son opciones de ‘grep’ no de ‘egrep’ exclusivamente.

    Saludos cordiales.

    1.    Isaac dijo

      Gracias por avisar por ese error. Lo que comentas de las expresiones regulares, ya lo puse en el segundo párrafo. Dedicaré un artículo específico a ellas, porque hay muchas y se alargaría demasiado éste artículo. Un saludo!

      1.    Manuel Alcocer dijo

        Hola de nuevo, Isaac.

        En el segundo párrafo básicamente dices, o deberías haber dicho, que ‘egrep’ es un alias de ‘grep -E’, pero no pones ningún ejemplo de usar ‘egrep’ con alguna expresión regular que se escriba distinta a cuando se usa mediante ‘grep’.

        Dedicar un artículo a explicar las expresiones regulares extendidas me parece una osadía, entre otras cosas porque hay sites como este que no ponen publicidad y están haciendo una labor informativa muy importante a la comunidad GNU: https://www.rexegg.com/

        No escribo aquí por trolear, mi intención con todo esto es que si alguien lee esta entrada para ver qué hace ‘egrep’ o ‘grep’, que por favor mire otras fuentes, esta entrada no puede ser referente de nada, explica poco, mal, ofrece información superflua y puede resultar confusa, sobre todo para aquellos no tienen ningún conocimiento de GNU y las potentes herramientas que ofrece.

        Por último, habéis añadido y arreglado el fallo que os indiqué después de mi primer comentario (^$). Como en otros sites, deberías haber citado a la persona que ha hecho la corrección, o al lo menos decir que es una corrección, eso forma parte de la base de GNU, la misma base con la que se inició este blog y que se ha perdido.

        Un saludo.

        1.    Isaac dijo

          Gracias por tu punto de vista.

  2.   fsafs dijo

    ffsaf