egrep: voorbeelden van het commando in GNU / Linux

egr

grep is een van de meest gebruikte tools op de GNU/Linux-opdrachtregel. Ondanks dat het een heel eenvoudig hulpmiddel is, kunt u er een groot aantal bewerkingen mee uitvoeren. Het wordt vooral gebruikt in combinatie met pijpen, om specifieke punten te kunnen lokaliseren in de uitvoer van een vorig commando, enz. Maar er is ook een tool die bekend staat als egrep, wat overeenkomt met het uitvoeren van grep met de optie -E.

De e staat voor "Extended regex", wat de optie -E activeert en wat je standaard in egrep hebt zonder die optie te gebruiken. Dat wil zeggen, u kunt de uitgebreide reguliere expressies. In deze tutorial zal ik niet uitleggen wat reguliere expressies zijn, hoe ze kunnen worden gebruikt en welke typen *nix bevatten. Ik zal alleen praktische voorbeelden laten zien van enkele nuttige dingen die u met egrep kunt doen ...

grep, egrep en fgrep zijn vergelijkbaar. In feite is egrep gelijk aan grep -E en fgrep is gelijk aan grep -F. Dat wil zeggen, in het geval dat ons betreft, zal het de patronen ook als reguliere expressies interpreteren.

U zoek naar een regel of woord concreet naar één of meerdere bestanden, zoals ook bij grep het geval is. Stel dat u bijvoorbeeld wilt zoeken naar het woord ubuntu in een bestand met de naam snap.txt en ook in alle .txt-bestanden in de huidige map:

egrep ubuntu snap.txt

egrep ubuntu *.txt

De zoektocht kan ook zijn recursief Om de volledige inhoud van de huidige map te doorzoeken:

egrep -r "hola mundo" *

Tot nu toe is er gezocht naar exacte woorden of tekenreeksen, dat wil zeggen rekening houdend met hoofdletters en kleine letters (hoofdlettergevoelig), maar als u dit in hoofdlettergevoelige modus wilt doen, ongeacht of ze hoofdletters of kleine letters zijn, kunt u het volgende gebruiken (als u toevoegt met alleen volledige overeenkomsten):

egrep -i "ejemplo" documento.txt

egrep -iw "ejemplo" documento.txt

Toon niet de toevalligheden, maar de bestandsnamen waar die overeenkomsten werden gevonden:

egrep -l hola *.txt

Toon alleen het patroon of woord gezocht binnen een document:

egrep -o printf hola.c

Onthoud dat u alle mogelijkheden kunt gebruiken die u zich kunt voorstellen. U kunt verschillende van de bovenstaande opties combineren, of u kunt ze aanvullen met andere opties zoals -A n en -B n, waarbij n het aantal regels dat je voor (Before) en na (After) wilt laten zien van de wedstrijd of beide tegelijk (C), zodat je kunt zien wat die wedstrijd omringt:

egrep -A 2 "printf" hola.c

egrep -B 2 "printf" hola.c

egrep -C 2 printf hola.c

Onderdruk de regels die een overeenkomst bevatten en toon alleen de regels die niet overeenkomen:

egrep -v "dos" números.doc

Of als u wilt, kunt u gebruiken meerdere woorden of overeenkomsten met -e. Bijvoorbeeld:

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

Als u gebruikt -c kan alleen het aantal matches tellen, of keer het om met -v zodat het het aantal niet-overeenkomende regels toont. Bijvoorbeeld:

egrep -c "include" main.c

egrep -v -c "include" main.c

En zelfs lijnnummer tonen waar de wedstrijd heeft plaatsgevonden, en ook de positie die deze respectievelijk inneemt:

egrep -n "void" hola.c

egrep -o -b "printf" hola.c

En samen met de normale uitdrukkingen zijn mogelijkheden kunnen worden uitgebreid. Zoek bijvoorbeeld naar een regel die begint met Hallo en eindigt met Tot ziens, of die begint met Hallo gevolgd door wat dan ook en dan overeenkomt met respectievelijk Tot ziens:

* Correctie van het volgende commando: dankzij de opmerking van de lezer Manuel Alcocer heb ik het volgende commando kunnen wijzigen, aangezien er een fout was.

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

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

Maar als je je afvraagt ​​wat het verschil is met grep, hier is een voorbeeld dat het duidelijk zal maken... In het geval van het gebruik van grep zonder -E moet je de ontsnappingsreeksen zodat het de speciale tekens als zodanig interpreteert, omdat het anders het patroon als zodanig zou interpreteren zonder er rekening mee te houden. Aan de andere kant, met egrep of grep -E zal het er rekening mee houden. Bijvoorbeeld:
grep '^no\(fork\|group\)' /etc/group

Dat zou gelijk zijn aan:

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

Dat wil zeggen, het zoekt naar overeenkomende regels die beginnen met nofork of nogroup. Maar als je de eerste grep-expressie zonder de escape-reeksen zou gebruiken, zou het zoeken zijn het concrete patroon nee(vork|groep):

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

U kunt ook zoeken alfanumerieke reeksen, of specifieke waarden, zoals het lokaliseren van bepaalde IP's:
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

Als u wilt, kunt u andere reguliere expressies gebruiken om specifiekere zoekopdrachten uit te voeren. Bijvoorbeeld | om er een te zoeken toeval of anders:

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

U kunt zelfs lokaliseren hoofdletters, kleine letters, alleen alfabetische tekens of alfanumerieke tekens, enz., met andere uitdrukkingen zoals: [:alnum:], [:alpha:], [:digit:], [:lower:], [:print:], [:punct:], [:space:], [ : bovenste:], enz. Om bijvoorbeeld op hoofdletters te zoeken:
egrep [[:upper:]] diccioario

Ik hoop dat het je helpt... Binnenkort zal ik reguliere expressies uitleggen in een speciaal hieraan gewijd artikel...


Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.

  1.   Tijdelijke afbeelding voor Manuel Alcocer zei

    Goedemiddag.

    Enkele opmerkingen…

    Je legt het 'egrep'-commando uit, maar je maakt niet het verschil tussen 'egrep' en 'grep', waar het hier om zou moeten gaan.

    Bijvoorbeeld:
    Met grep: ip -4 a | grep '[0-9]\+'
    Met egrep: ip -4 tot | egrep '[0-9]+'

    Ahh, en dit is fout, 'egrep "Hallo.*dag" voorbeeld.txt'; Het succes komt hier voor wanneer er een regel in het bestand is die de string 'Hallo' bevat, gevolgd door wat dan ook en gevolgd door 'Tot ziens', de regel kan echt met alles beginnen en eindigen.

    Dit zou zijn wat er in het artikel staat:
    egrep '^Hallo.*dag$' voorbeeld.txt

    En alle opties, of bijna allemaal (ik stop niet om het te controleren), zijn 'grep'-opties, niet uitsluitend 'egrep'.

    Met vriendelijke groet.

    1.    Isaac zei

      Bedankt voor het melden van die bug. Wat je zegt over reguliere expressies, heb ik al in de tweede alinea gezet. Ik zal er een specifiek artikel aan wijden, want het zijn er veel en dit artikel zou te lang duren. Al het beste!

      1.    Tijdelijke afbeelding voor Manuel Alcocer zei

        Nogmaals hallo Isaak.

        In de tweede alinea zeg je eigenlijk, of had je moeten zeggen, dat 'egrep' een alias is van 'grep -E', maar je geeft geen voorbeelden van het gebruik van 'egrep' met een reguliere expressie die anders wordt getypt dan wanneer het wordt gebruikt door 'grep'.

        Een artikel wijden aan het uitleggen van uitgebreide reguliere expressies lijkt me gedurfd, onder andere omdat er sites zoals deze zijn die niet adverteren en een zeer belangrijke taak vervullen door de GNU-gemeenschap te informeren: https://www.rexegg.com/

        Ik schrijf hier niet om te trollen, mijn bedoeling met dit alles is dat als iemand dit bericht leest om te zien wat 'egrep' of 'grep' doet, kijk alsjeblieft naar andere bronnen, dit bericht kan nergens naar verwijzen, het verklaart weinig , slecht , biedt overbodige informatie en kan verwarrend zijn, vooral voor degenen die geen kennis hebben van GNU en de krachtige tools die het biedt.

        Eindelijk heb je de bug toegevoegd en opgelost waar ik op wees na mijn eerste opmerking (^$). Net als op andere sites had je de persoon moeten noemen die de correctie heeft aangebracht, of in ieder geval moeten zeggen dat het een correctie is, die deel uitmaakt van de GNU-basis, dezelfde basis waarmee deze blog begon en verloren is gegaan.

        Een groet.

        1.    Isaac zei

          Bedankt voor uw standpunt.

  2.   fsafs zei

    ffsaf