egrep: eksempler på kommandoen i GNU / Linux

egrep

grep det er et af de mest anvendte værktøjer på GNU / Linux-kommandolinjen. På trods af at det er et meget simpelt værktøj, giver det dig mulighed for at udføre et stort antal operationer. Det bruges især sammen med rør for at være i stand til at lokalisere bestemte punkter i output fra en tidligere kommando osv. Men der er også et værktøj kendt som egrep, der svarer til at køre grep med indstillingen -E.

E kommer fra "Extended regex", hvilket er det, der aktiverer -E-indstillingen, og hvad du har i egrep som standard uden at bruge denne mulighed. Det vil sige, du kan bruge udvidede regulære udtryk. I denne vejledning vil jeg ikke gå ind på at forklare, hvad regulære udtryk er, hvordan de kan bruges, og hvilke typer der er i * nix. Jeg viser bare praktiske eksempler på nogle nyttige ting, du kan gøre med egrep ...

grep, egrep og fgrep er ens. Faktisk svarer egrep til grep -E og fgrep svarer til grep -F. I det tilfælde, der vedrører os, vil det også fortolke mønstrene som regulære udtryk.

Du søg efter en linje eller et ord i en eller flere filer, som det også er tilfældet med grep. Antag for eksempel, at du vil søge efter ordet ubuntu i en fil kaldet snap.txt og også i alle .txt-filerne i den aktuelle bibliotek:

egrep ubuntu snap.txt

egrep ubuntu *.txt

Søgning kan også være rekursiv Sådan søger du i hele indholdet af den aktuelle telefonbog:

egrep -r "hola mundo" *

Indtil videre blev der søgt efter nøjagtige ord eller strenge, dvs. under hensyntagen til store og små bogstaver (store og små bogstaver), men hvis du vil gøre det i store og små bogstaver, uanset om de er store eller små bogstaver, kan du bruge følgende (hvis du tilføjer w, finder den kun komplette matches):

egrep -i "ejemplo" documento.txt

egrep -iw "ejemplo" documento.txt

Vis ikke tilfældighederne, men filnavne, hvor disse matches blev fundet:

egrep -l hola *.txt

Vis kun mønster eller ord søgte i et dokument:

egrep -o printf hola.c

Husk at du kan bruge alle de muligheder, du kan forestille dig. Du kan kombinere flere af de indstillinger, der tidligere er set, eller du kan supplere dem med andre muligheder såsom -A n og -B n, hvor n antallet af linjer, du vil vise før (før) og efter (efter) af kampen eller begge på samme tid (C), så du kan se, hvad der omgiver kampen:

egrep -A 2 "printf" hola.c

egrep -B 2 "printf" hola.c

egrep -C 2 printf hola.c

Undertryk de linjer, der indeholder et match, og vis kun dem, der ikke matcher:

egrep -v "dos" números.doc

Eller hvis du foretrækker det, kan du bruge flere ord eller matches med -e. For eksempel:

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

Hvis du bruger -c kan kun tælle antallet af kampe, eller vend det med -v for at vise antallet af uoverensstemmende linjer. For eksempel:

egrep -c "include" main.c

egrep -v -c "include" main.c

Og endda vis linjenummer hvor kampen har fundet sted, og også henholdsvis den position, den indtager:

egrep -n "void" hola.c

egrep -o -b "printf" hola.c

Og sammen med regelmæssige udtryk dens evner kan udvides. Find for eksempel en linje, der begynder med Hej og slutter med farvel, eller som begynder med Hej efterfulgt af hvad som helst, og derefter vises matchbyen henholdsvis:

* Korrektion af følgende kommando: takket være kommentaren fra læseren Manuel Alcocer har jeg været i stand til at ændre følgende kommando, da der var en fejl.

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

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

Men hvis du spekulerer på forskellen med grep, her er et eksempel, der gør det klart for dig ... I tilfælde af at bruge grep uden -E, skal du bruge undslippe sekvenser så det fortolker specialtegnene som sådan, ellers fortolker det mønsteret som sådant uden at tage dem i betragtning. På den anden side vil det med egrep eller grep -E tage dem i betragtning. For eksempel:
grep '^no\(fork\|group\)' /etc/group

Det svarer til:

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

Det vil sige, det vil se efter de matchende linjer, der begynder med nofork eller nogroup. Men hvis du brugte greps første udtryk uden escape-sekvenserne, hvad det ville gøre er at søge det konkrete mønster nej (gaffel | gruppe):

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

Du kan også søge alfanumeriske intervallereller specifikke værdier, såsom at lokalisere 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 foretrækker det, kan du bruge andre regulære udtryk til at foretage mere specifikke søgninger. For eksempel | at finde en tilfældighed eller det andet:

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

Du kan endda finde store, små bogstaver, kun alfabetiske tegn eller alfanumeriske osv., ved hjælp af andre udtryk som: [: alnum:], [: alpha:], [: ciffer:], [: lavere:], [: print:], [: punkt:], [: mellemrum:], [ : øvre:] osv. For eksempel for at søge efter store bogstaver:
egrep [[:upper:]] diccioario

Jeg håber det hjælper dig ... Snart vil jeg forklare regelmæssige udtryk i en artikel dedikeret specifikt til det ...


Indholdet af artiklen overholder vores principper for redaktionel etik. Klik på for at rapportere en fejl her.

5 kommentarer, lad dine

Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.

  1.   Billede af Manuel Alcocer sagde han

    God eftermiddag.

    Et par bemærkninger ...

    Du forklarer kommandoen 'egrep', men læg ikke forskellen mellem 'egrep' og 'grep', hvilket skulle være, hvad det er her.

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

    Ahh, og dette er forkert, 'egrep "Hej. * Bye" eksempel.txt'; succesen her opstår, når der er en linje i filen, der indeholder strengen 'Hej' efterfulgt af hvad som helst og efterfulgt af 'farvel', kan linjen virkelig starte og slutte med hvad som helst.

    Dette ville være, hvad artiklen siger:
    egrep '^ Hej. * bye $' eksempel.txt

    Og alle mulighederne, eller næsten alle (jeg stopper ikke med at kontrollere det), er muligheder for 'grep' ikke udelukkende af 'egrep'.

    Venlig hilsen.

    1.    Isaac sagde han

      Tak, fordi du rapporterede den fejl. Hvad du kommenterer på de regulære udtryk, har jeg allerede anført det i andet afsnit. Jeg vil dedikere en bestemt artikel til dem, fordi der er mange, og denne artikel vil tage for lang tid. En hilsen!

      1.    Billede af Manuel Alcocer sagde han

        Hej igen, Isaac.

        I andet afsnit siger du eller burde have sagt, at 'egrep' er et alias for 'grep -E', men du giver ikke noget eksempel på at bruge 'egrep' med noget regulært udtryk, der er skrevet anderledes end når brugt af 'grep'.

        At dedikere en artikel til at forklare udvidede regulære udtryk virker for mig dristig, blandt andet fordi der er sider som dette, der ikke reklamerer for og udfører meget vigtigt informativt arbejde for GNU-samfundet: https://www.rexegg.com/

        Jeg skriver ikke her for at trolde, min hensigt med alt dette er, at hvis nogen læser denne post for at se, hvad 'egrep' eller 'grep' gør, skal du se på andre kilder, denne post kan ikke være en henvisning til noget, det forklarer lidt , dårligt, tilbyder overflødig information og kan være forvirrende, især for dem, der ikke har kendskab til GNU og de kraftfulde værktøjer, den tilbyder.

        Endelig har du tilføjet og rettet den fejl, som jeg angav efter min første kommentar (^ $). Som på andre sider skulle du have citeret den person, der foretog korrektionen, eller i det mindste siger, at det er en korrektion, der er en del af GNU-basen, den samme base, som denne blog blev startet med og er gået tabt.

        En hilsen.

        1.    Isaac sagde han

          Tak for dit synspunkt.

  2.   fsafs sagde han

    ffsaf