egrep: exemplos do comando en GNU / Linux

egrep

grep é unha das ferramentas máis usadas na liña de comandos GNU / Linux. A pesar de ser unha ferramenta moi sinxela, permítelle realizar un gran número de operacións. Úsase especialmente xunto con tubos, para poder localizar puntos específicos na saída dun comando anterior, etc. Pero tamén hai unha ferramenta coñecida como egrep que equivale a executar grep coa opción -E.

O e vén de "Exge regex", que é o que activa a opción -E e o que ten en egrep por defecto sen empregar esa opción. É dicir, pode usar o expresións regulares ampliadas. Neste tutorial non vou entrar a explicar que son as expresións regulares, como se poden usar e que tipos están en * nix. Só vou amosar exemplos prácticos dalgunhas cousas útiles que podes facer con egrep ...

grep, egrep e fgrep son similares. De feito, egrep equivale a grep -E e fgrep equivale a grep -F. É dicir, no caso que nos ocupa, tamén interpretará os patróns como expresións regulares.

Vostede busca unha liña ou palabra nun ou máis ficheiros, como tamén ocorre con grep. Por exemplo, imaxina que queres buscar a palabra ubuntu nun ficheiro chamado snap.txt e tamén en todos os ficheiros .txt do directorio actual:

egrep ubuntu snap.txt

egrep ubuntu *.txt

A busca tamén pode ser recursivo Para buscar todo o contido do directorio actual:

egrep -r "hola mundo" *

Ata o momento buscáronse palabras ou cadeas exactas, é dicir, tendo en conta maiúsculas e minúsculas (maiúsculas e minúsculas), pero se queres facelo en modo sen distinción entre maiúsculas e minúsculas, non importan se son maiúsculas ou minúsculas, pode usar o seguinte (se engade w só atopa coincidencias completas):

egrep -i "ejemplo" documento.txt

egrep -iw "ejemplo" documento.txt

Amosa, non as casualidades, pero os nomes dos ficheiros onde se atoparon esas coincidencias:

egrep -l hola *.txt

Mostrar só o patrón ou a palabra buscado dentro dun documento:

egrep -o printf hola.c

Lembre que pode empregar todas as posibilidades que poida imaxinar. Pode combinar varias das opcións vistas anteriormente ou pode complementalas con outras opcións como -A n e -B n, onde n o número de liñas que desexa amosar antes (Antes) e despois (Despois) do partido ou os dous ao mesmo tempo (C), para que poida ver o que rodea o partido:

egrep -A 2 "printf" hola.c

egrep -B 2 "printf" hola.c

egrep -C 2 printf hola.c

Suprimir as liñas que conteñen unha coincidencia e mostrar só as que non coinciden:

egrep -v "dos" números.doc

Ou se o prefires, podes empregalo varias palabras ou coincidencias con -e. Por exemplo:

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

Se usas -c só pode contar o número de coincidenciasou invísteo con -v para amosar o número de liñas que non coinciden. Por exemplo:

egrep -c "include" main.c

egrep -v -c "include" main.c

E mesmo amosar o número de liña onde se produciu o partido e tamén a posición que ocupa respectivamente:

egrep -n "void" hola.c

egrep -o -b "printf" hola.c

E xunto co expresións regulares as súas capacidades pódense ampliar. Por exemplo, busque unha liña que comece por Ola e remate por bye, ou que comece por Ola seguida de calquera cousa e despois apareza a correspondencia por ata respectivamente:

* Corrección do seguinte comando: grazas ao comentario do lector Manuel Alcocer puiden modificar o seguinte comando, xa que houbo un erro.

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

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

Pero se te preguntas sobre a diferenza con grep, aquí tes un exemplo que o deixará claro ... No caso de usar grep sen -E deberías usar o secuencias de escape de xeito que interpreta os caracteres especiais como tales, se non, interpretaría o patrón como tal sen telos en conta. Por outra banda, con egrep ou grep -E terase en conta. Por exemplo:
grep '^no\(fork\|group\)' /etc/group

Isto equivaldría a:

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

É dicir, buscaría as liñas coincidentes que comezan por nofork ou nogroup. Pero se usase a primeira expresión de grep sen as secuencias de escape, o que faría sería buscar o patrón concreto non (garfo | grupo):

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

Tamén podes buscar rangos alfanuméricosou valores específicos, como para localizar determinadas IP:
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

Se o prefires, podes usar outras expresións regulares para facer buscas máis específicas. Por exemplo | atopar un coincidencia ou a outra:

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

Podes incluso localizar maiúsculas, minúsculas, só caracteres alfabéticos ou alfanuméricos, etc., usando outras expresións como: [: alnum:], [: alpha:], [: digit:], [: lower:], [: print:], [: punct:], [: space:], [ : superior:], etc. Por exemplo, para buscar maiúsculas:
egrep [[:upper:]] diccioario

Espero que che axude ... En breve explicarei expresións regulares nun artigo dedicado especificamente a el ...


O contido do artigo adhírese aos nosos principios de ética editorial. Para informar dun erro faga clic en aquí.

5 comentarios, deixa os teus

Deixa o teu comentario

Enderezo de correo electrónico non será publicado.

*

*

  1. Responsable dos datos: Miguel Ángel Gatón
  2. Finalidade dos datos: controlar SPAM, xestión de comentarios.
  3. Lexitimación: o seu consentimento
  4. Comunicación dos datos: os datos non serán comunicados a terceiros salvo obrigación legal.
  5. Almacenamento de datos: base de datos aloxada por Occentus Networks (UE)
  6. Dereitos: en calquera momento pode limitar, recuperar e eliminar a súa información.

  1.   Marcador de posición de Manuel Alcocer dixo

    Boa tarde.

    Algunhas observacións ...

    Explica o comando 'egrep' pero non pon a diferenza entre 'egrep' e 'grep', que debería ser o que hai aquí.

    Por exemplo:
    Con grep: ip -4 a | grep '[0-9] \ +'
    Con egrep: ip -4 a | egrep '[0-9] +'

    Ahh, e isto está mal, 'egrep "Ola. * Bye" example.txt'; o éxito aquí prodúcese cando hai unha liña no ficheiro que contén a cadea "Ola" seguida de calquera cousa e seguida de "adeus", a liña pode comezar e rematar con calquera cousa.

    Isto sería o que di o artigo:
    egrep '^ Ola. * bye $' example.txt

    E todas as opcións, ou case todas (non paro de comprobalo), son opcións de "grep" non de "egrep" exclusivamente.

    Saúdos.

    1.    Isaac dixo

      Grazas por informar dese erro. O que comentas sobre as expresións regulares, xa o poño no segundo parágrafo. Voulles dedicar un artigo específico, porque hai moitos e este artigo tardaría demasiado. Un saúdo!

      1.    Marcador de posición de Manuel Alcocer dixo

        Ola de novo, Isaac.

        No segundo parágrafo basicamente di, ou debería dicir, que "egrep" é un alias de "grep -E", pero non dá ningún exemplo de usar "egrep" con algunha expresión regular que se escribe de xeito diferente que cando usado por "grep".

        Dedicar un artigo para explicar expresións regulares amplas paréceme audaz, entre outras cousas porque hai sitios coma este que non anuncian e están a facer un traballo informativo moi importante para a comunidade GNU: https://www.rexegg.com/

        Non estou a escribir aquí para facer troll, a miña intención con todo isto é que se alguén le esta entrada para ver o que fai "egrep" ou "grep", mire outras fontes, esta entrada non pode ser unha referencia a nada, explica pouco, mal, ofrece información superflua e pode resultar confuso, especialmente para aqueles que non teñen coñecemento de GNU e das poderosas ferramentas que ofrece.

        Finalmente, engadiu e arranxou o erro que indiquei despois do meu primeiro comentario (^ $). Como noutros sitios, deberías citar á persoa que fixo a corrección ou, polo menos, dicir que é unha corrección, que forma parte da base GNU, a mesma base coa que se iniciou este blog e se perdeu.

        Un saúdo.

        1.    Isaac dixo

          Grazas polo teu punto de vista.

  2.   fsafs dixo

    ffff

bool (verdadeiro)