egrep: kommandoeksempler i GNU / Linux

egrep

grep det er et av de mest brukte verktøyene på GNU / Linux-kommandolinjen. Til tross for at det er et veldig enkelt verktøy, lar det deg utføre et stort antall operasjoner. Den brukes spesielt sammen med rør for å kunne finne bestemte punkter i utgangen fra en tidligere kommando, etc. Men det er også et verktøy kjent som egrep som tilsvarer å kjøre grep med alternativet -E.

E kommer fra "Extended regex", som aktiverer alternativet -E og hva du har i egrep som standard uten å bruke det alternativet. Det vil si at du kan bruke utvidet regulære uttrykk. I denne opplæringen vil jeg ikke gå inn på å forklare hva regulære uttrykk er, hvordan de kan brukes og hvilke typer som er i * nix. Jeg vil bare vise deg praktiske eksempler på noen nyttige ting du kan gjøre med egrep ...

grep, egrep og fgrep er like. Egrep tilsvarer faktisk grep -E og fgrep tilsvarer grep -F. Det vil si at i tilfellet som gjelder oss, vil det også tolke mønstrene som vanlige uttrykk.

Du søk etter en linje eller et ord i en eller flere filer, slik det også er tilfelle med grep. Tenk deg for eksempel at du vil søke etter ordet ubuntu i en fil som heter snap.txt og også i alle .txt-filene i gjeldende katalog:

egrep ubuntu snap.txt

egrep ubuntu *.txt

Søk kan også være tilbakevendende Slik søker du i hele innholdet i den gjeldende katalogen:

egrep -r "hola mundo" *

Så langt ble det søkt etter nøyaktige ord eller strenger, det vil si å ta hensyn til store og små bokstaver (store og små bokstaver), men hvis du vil gjøre det i store og små bokstaver, uansett om de er store eller små bokstaver, kan du bruke følgende (hvis du legger til w, finner den bare komplette treff):

egrep -i "ejemplo" documento.txt

egrep -iw "ejemplo" documento.txt

Vis, ikke tilfeldighetene, men filnavnene der disse treffene ble funnet:

egrep -l hola *.txt

Vis bare mønsteret eller ordet søkte i et dokument:

egrep -o printf hola.c

Husk at du kan bruke alle mulighetene du kan forestille deg. Du kan kombinere flere av alternativene du har sett tidligere, eller du kan supplere dem med andre alternativer som -A n og -B n, der n antall linjer du vil vise før (før) og etter (etter) av kampen eller begge samtidig (C), slik at du kan se hva som omgir kampen:

egrep -A 2 "printf" hola.c

egrep -B 2 "printf" hola.c

egrep -C 2 printf hola.c

Undertrykk linjer som inneholder et treff og viser bare de som ikke stemmer overens:

egrep -v "dos" números.doc

Eller hvis du foretrekker det, kan du bruke flere ord eller treff med -e. For eksempel:

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

Hvis du bruker -c kan bare telle antall kamper, eller snu den med -v for å vise antall linjer som ikke samsvarer. For eksempel:

egrep -c "include" main.c

egrep -v -c "include" main.c

Til og med vis linjenummer der kampen har skjedd, og også posisjonen den inntar henholdsvis:

egrep -n "void" hola.c

egrep -o -b "printf" hola.c

Og sammen med vanlig uttrykk dens evner kan utvides. Finn for eksempel en linje som begynner med Hello og slutter med bye, eller som begynner med Hello etterfulgt av hva som helst, og deretter vises matchbyen henholdsvis:

* Retting av følgende kommando: takket være kommentaren til leseren Manuel Alcocer har jeg vært i stand til å endre følgende kommando, siden det var en feil.

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

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

Men hvis du lurer på forskjellen med grep, her er et eksempel som vil gjøre det klart ... Hvis du bruker grep uten -E, bør du bruke unnslippe sekvenser slik at den tolker spesialtegnene som sådan, ellers tolker den mønsteret slik uten å ta hensyn til dem. På den annen side vil egrep eller grep -E ta hensyn til dem. For eksempel:
grep '^no\(fork\|group\)' /etc/group

Det tilsvarer:

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

Det vil si at det vil se etter de matchende linjene som begynner med nofork eller nogroup. Men hvis du brukte greps første uttrykk uten rømningssekvensene, ville det gjøre å søke betongmønsteret nei (gaffel | gruppe):

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

Du kan også søke alfanumeriske områder, eller spesifikke verdier, for eksempel for å finne bestemte IP-er:
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

Hvis du foretrekker det, kan du bruke andre vanlige uttrykk for å gjøre mer spesifikke søk. For eksempel | å finne en tilfeldighet eller det andre:

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

Du kan til og med finne store, små bokstaver, bare alfabetiske tegn eller alfanumeriske osv., ved å bruke andre uttrykk som: [: alnum:], [: alpha:], [: digit:], [: lower:], [: print:], [: punct:], [: space:], [ : øvre:] osv. For eksempel for å søke etter store bokstaver:
egrep [[:upper:]] diccioario

Jeg håper det hjelper deg ... Snart vil jeg forklare vanlige uttrykk i en artikkel dedikert spesielt til den ...


Legg igjen kommentaren

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Kontroller SPAM, kommentaradministrasjon.
  3. Legitimering: Ditt samtykke
  4. Kommunikasjon av dataene: Dataene vil ikke bli kommunisert til tredjeparter bortsett fra ved juridisk forpliktelse.
  5. Datalagring: Database vert for Occentus Networks (EU)
  6. Rettigheter: Når som helst kan du begrense, gjenopprette og slette informasjonen din.

  1.   Manuel Alcocers plassholderbilde sa

    God dag.

    Noen få merknader ...

    Du forklarer 'egrep' -kommandoen, men legger ikke forskjellen mellom 'egrep' og 'grep', som burde være hva den er her.

    For eksempel:
    Med grep: ip -4 a | grep '[0-9] \ +'
    Med egrep: ip -4 a | egrep '[0-9] +'

    Ahh, og dette er galt, 'egrep "Hei. * Bye" eksempel.txt'; suksessen her oppstår når det er en linje i filen som inneholder strengen 'Hallo' etterfulgt av hva som helst og etterfulgt av 'farvel', kan linjen virkelig starte og ende med hva som helst.

    Dette vil være hva artikkelen sier:
    egrep '^ Hei. * bye $' eksempel.txt

    Og alle alternativene, eller nesten alle (jeg slutter ikke å sjekke det), er alternativer for 'grep' ikke for 'egrep' utelukkende.

    Hilsen.

    1.    Isaac sa

      Takk for at du rapporterte den feilen. Det du kommenterer på regulære uttrykk, setter jeg det allerede i andre ledd. Jeg vil vie en bestemt artikkel til dem, fordi det er mange, og denne artikkelen vil ta for lang tid. En hilsen!

      1.    Manuel Alcocers plassholderbilde sa

        Hei igjen, Isaac.

        I andre ledd sier du eller burde ha sagt at 'egrep' er et alias for 'grep -E', men du gir ikke noe eksempel på å bruke 'egrep' med noe regulært uttrykk som er skrevet annerledes enn når brukt av 'grep'.

        Å dedikere en artikkel for å forklare utvidede regulære uttrykk virker dristig for meg, blant annet fordi det er nettsteder som dette som ikke annonserer og gjør veldig viktig informasjonsarbeid for GNU-samfunnet: https://www.rexegg.com/

        Jeg skriver ikke her for trolling, min intensjon med alt dette er at hvis noen leser denne oppføringen for å se hva 'egrep' eller 'grep' gjør, kan du se på andre kilder, denne oppføringen kan ikke være en referanse til noe, forklarer det lite, dårlig, tilbyr overflødig informasjon og kan være forvirrende, spesielt for de som ikke har kunnskap om GNU og de kraftige verktøyene den tilbyr.

        Til slutt har du lagt til og fikset feilen som jeg angav etter min første kommentar (^ $). Som på andre nettsteder, burde du ha sitert personen som gjorde rettingen, eller i det minste si at det er en rettelse, som er en del av GNU-basen, den samme basen som denne bloggen ble startet med og har gått tapt.

        En hilsen.

        1.    Isaac sa

          Takk for ditt synspunkt.

  2.   fsafs sa

    ffff