egrep: exemples de la comanda en GNU / Linux

egrep

grep és una de les eines més usades en la línia d'ordres del GNU / Linux. Tot i ser una eina molt simple, permet realitzar gran quantitat d'operacions. S'usa especialment juntament amb les canonades, per poder localitzar punts concrets en la sortida d'una ordre previ, etc. Però també hi ha una eina coneguda com egrep que equival a executar grep amb l'opció -I.

L'e prové de «Extended regex», que és el que activa l'opció -I i el que tens a egrep per defecte sense necessitat d'usar aquesta opció. És a dir, que podràs fer servir les expressions regulars esteses. En aquest tutorial no entraré a explicar què són les expressions regulars, com es poden utilitzar i quins tipus hi ha als * nix. Simplement mostraré exemples pràctics d'algunes coses útils que pots fer amb egrep ...

grep, egrep, i fgrep són similars. De fet, egrep equival a grep -I i fgrep equival a grep -F. És a dir, en el cas que ens concerneix, va interpretar els patrons també com a expressions regulars.

Pots cercar una línia o paraula concreta en un o diversos arxius, com també succeeix amb grep. Per exemple, imagina que vols buscar la paraula Ubuntu en un fitxer anomenat snap.txt i també en tots els .txt de directori actual:

egrep ubuntu snap.txt

egrep ubuntu *.txt

Hi pot ser també recursiva per buscar en tot el contingut de directori actual:

egrep -r "hola mundo" *

Fins aquí es buscaven paraules o cadenes exactes, és a dir, tenint en compte majúscules i minúscules (case-sensitive), però si vols fer-ho en mode casi-insensitive, independentment de si són mayúculas o minúscules, Pots usar el següent (si afegeixes w busca només coincidències completes):

egrep -i "ejemplo" documento.txt

egrep -iw "ejemplo" documento.txt

Mostrar, no les coincidències, sinó els noms de fitxers on s'han trobat aquestes coincidències:

egrep -l hola *.txt

Mostra només el patró o paraula buscada dins d'un document:

egrep -o printf hola.c

Recorda que pots fer servir totes les possibilitats que imaginis. Pots combinar diverses de les opcions vistes anteriorment, o les pots complementar amb altres opcions com -A ni -B n, sent n el nombre de línies que vols mostrar abans (Before) i després (After) de la coincidència o ambdues alhora (C), perquè així puguis veure el que envolta a aquesta coincidència:

egrep -A 2 "printf" hola.c

egrep -B 2 "printf" hola.c

egrep -C 2 printf hola.c

Suprimir les línies que contenen una coincidència i només mostrar les que no coincideixen:

egrep -v "dos" números.doc

O si ho prefereixes, pots utilitzar diverses paraules o coincidències amb -i. Per exemple:

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

si fas servir -c es poden sol comptar el nombre de coincidències, O invertir-amb -v perquè mostri el nombre de línies no coincidents. Per exemple:

egrep -c "include" main.c

egrep -v -c "include" main.c

I fins i tot mostrar el número de línia on s'ha produït la coincidència, i també la posició que ocupa respectivament:

egrep -n "void" hola.c

egrep -o -b "printf" hola.c

I juntament amb les expressions regulars es poden ampliar les seves capacitats. Per exemple, buscar una línia que comenci per Hola i acabi per adeu, o que comenci per Hola seguida del que sigui i després aparegui la coincidència adéu respectivament:

* Correcció de la següent comanda: gràcies a l'comentari de l'lector Manuel Alcocer he pogut modificar la següent comanda, ja que hi havia un error.

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

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

Però si et preguntes per la diferència amb grep, aquí tens un exemple que t'ho deixarà clar ... En el cas d'utilitzar grep sense -I hauries utilitzar les seqüències d'escapament perquè interpreti els caràcters especials com a tals, ja que en cas contrari interpretaria el patró com a tal sense tenir-los en compte. En canvi, amb egrep o grep -I sí que els va a tenir en compte. Per exemple:
grep '^no\(fork\|group\)' /etc/group

Això seria equivalent a:

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

És a dir, buscaria les línies que coincideixen comencen per nofork o nogroup. Però si usessis la primera forma de grep sense les seqüències d'escapament, el que faria és buscar el patró concret no (fork | group):

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

Pots també buscar rangs alfanumèrics, O valors concrets, com per exemple per localitzar certes 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 ho prefereixes, pots fer servir altres expressions regulars per a fer cerques més concretes. Per exemple | per buscar una coincidència o l'altra:

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

Fins i tot pots localitzar majúscules, minúscules, caràcters alfabètics sol, o alfanumèrics, etc., Usant altres expressions com: [: alnum:], [: alpha:], [: digit:], [: lower:], [: print:], [: punct:], [: space:], [: upper:], etc. Per exemple, per buscar majúscules:
egrep [[:upper:]] diccioario

Espero que t'ajudi ... Properament explicaré les expressions regulars en un article dedicat especialment a això ...


Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.

  1.   Manuel Alcocer va dir

    Bona tarda.

    Unes puntualitzacions ...

    Expliqueu el comandament 'egrep' però no poseu la diferència entre 'egrep' i 'grep', que hauria de ser del que es tractés aquí.

    Per exemple:
    Amb grep: ip -4 a | grep '[0-9] \ +'
    Amb egrep: ip -4 a | egrep '[0-9] +'

    Ahh, i això està malament, 'egrep «Hola. * Adéu» ejemplo.txt'; l'encert aquí es produeix quan en el fitxer hi hagi alguna línia que contingui la cadena 'Hola' seguit del que sigui i seguit de 'adéu', realment la línia pot començar i acabar pel que sigui.

    Això sí que seria el que diu l'article:
    egrep '^ Hola. * adéu $' ejemplo.txt

    I totes les opcions, o gairebé totes (no m'aturo a comprovar-ho), són opcions de 'grep' no de 'egrep' exclusivament.

    Salutacions cordials.

    1.    Isaac va dir

      Gràcies per avisar per aquest error. El que comentes de les expressions regulars, ja ho vaig posar en el segon paràgraf. Dedicaré un article específic a elles, perquè hi ha moltes i s'allargaria massa aquest article. Una salutació!

      1.    Manuel Alcocer va dir

        Hola de nou, Isaac.

        En el segon paràgraf bàsicament dius, o hauries d'haver dit, que 'egrep' és un àlies de 'grep -E', però no poses cap exemple d'usar 'egrep' amb alguna expressió regular que s'escrigui diferent a quan es fa servir mitjançant ' grep '.

        Dedicar un article a explicar les expressions regulars esteses em sembla una gosadia, entre altres coses perquè hi ha sites com aquest que no posen publicitat i estan fent una tasca informativa molt important a la comunitat GNU: https://www.rexegg.com/

        No escric aquí per trolear, la meva intenció amb tot això és que si algú llegeix aquesta entrada per veure què fa 'egrep' o 'grep', que si us plau miri altres fonts, aquesta entrada no pot ser referent de res, explica poc, malament , ofereix informació supèrflua i pot resultar confusa, sobretot per a aquells no tenen cap coneixement de GNU i les potents eines que ofereix.

        Finalment, heu afegit i arreglat la sentència que us vaig indicar després del meu primer comentari (^ $). Com en altres sites, hauries d'haver citat a la persona que ha fet la correcció, o a l'almenys dir que és una correcció, això forma part de la base de GNU, la mateixa base amb la qual es va iniciar aquest blog i que s'ha perdut.

        Una salutació.

        1.    Isaac va dir

          Gràcies per el teu punt de vista.

  2.   fsafs va dir

    ffsaf