egrep: příklady příkazů v GNU / Linux

Egrep

grep je to jeden z nejpoužívanějších nástrojů příkazového řádku GNU / Linux. Přestože je to velmi jednoduchý nástroj, umožňuje provádět velké množství operací. Používá se zejména společně s trubkami, aby bylo možné lokalizovat konkrétní body ve výstupu předchozího příkazu atd. Existuje ale také nástroj známý jako egrep, který je ekvivalentní spuštění grepu s volbou -E.

E pochází z „Extended regex“, což je to, co aktivuje volbu -E a co máte ve egrepu ve výchozím nastavení bez použití této možnosti. To znamená, že můžete použít rozšířené regulární výrazy. V tomto tutoriálu se nebudu zabývat vysvětlením, co jsou regulární výrazy, jak je lze použít a jaké typy jsou v * nix. Ukážu jen praktické příklady některých užitečných věcí, které můžete s egrep dělat ...

grep, egrep a fgrep jsou podobné. Ve skutečnosti je egrep ekvivalentní grep -E a fgrep je ekvivalentní grep -F. To znamená, že v případě, že se nás to týká, bude také interpretovat vzorce jako regulární výrazy.

Vy vyhledejte řádek nebo slovo v jednom nebo více souborech, jak je tomu také v případě grep. Představte si například, že chcete hledat slovo ubuntu v souboru s názvem snap.txt a také ve všech souborech .txt v aktuálním adresáři:

egrep ubuntu snap.txt

egrep ubuntu *.txt

Hledání může být také rekurzivní Hledání celého obsahu aktuálního adresáře:

egrep -r "hola mundo" *

Dosud byla prohledávána přesná slova nebo řetězce, to znamená s přihlédnutím k velkým a malým písmenům (rozlišují se malá a velká písmena), ale pokud to chcete udělat v režimu nerozlišování malých a velkých písmen, bez ohledu na to, zda jsou velká nebo malá, můžete použít následující (pokud přidáte w najde pouze úplné shody):

egrep -i "ejemplo" documento.txt

egrep -iw "ejemplo" documento.txt

Ukažte, ne náhody, ale názvy souborů, kde byly nalezeny tyto shody:

egrep -l hola *.txt

Zobrazit pouze vzor nebo slovo prohledáno v dokumentu:

egrep -o printf hola.c

Pamatujte, že můžete využít všechny možnosti, které si dokážete představit. Můžete kombinovat několik dříve viděných možností nebo je můžete doplnit o další možnosti, například -An a -Bn, kde n počet řádků, které chcete zobrazit před (Před) a po (Po) zápasu nebo obou současně (C), abyste viděli, co zápas obklopuje:

egrep -A 2 "printf" hola.c

egrep -B 2 "printf" hola.c

egrep -C 2 printf hola.c

Potlačte řádky, které obsahují shodu, a zobrazte pouze ty, které se neshodují:

egrep -v "dos" números.doc

Nebo pokud chcete, můžete použít více slov nebo shody s -e. Například:

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

Pokud používáte -c může spočítat pouze počet zápasů, nebo jej invertujte pomocí -v pro zobrazení počtu neodpovídajících řádků. Například:

egrep -c "include" main.c

egrep -v -c "include" main.c

A dokonce zobrazit číslo řádku kde došlo ke shodě, a také pozice, kterou zaujímá:

egrep -n "void" hola.c

egrep -o -b "printf" hola.c

A spolu s regulární výrazy jeho možnosti lze rozšířit. Například najděte řádek, který začíná Hello a končí bye, nebo který začíná Hello, následuje cokoli a poté se zobrazí shoda bye:

* Oprava následujícího příkazu: díky komentáři čtenáře Manuela Alcocera jsem byl schopen upravit následující příkaz, protože došlo k chybě.

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

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

Pokud se ale divíte rozdílu s grepem, zde je příklad, který objasní ... V případě použití grep bez -E byste měli použít únikové sekvence takže interpretuje speciální znaky jako takové, jinak by interpretoval vzor jako takový, aniž by je vzal v úvahu. Na druhou stranu s egrep nebo grep -E je vezme v úvahu. Například:
grep '^no\(fork\|group\)' /etc/group

To by odpovídalo:

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

To znamená, že by hledal odpovídající řádky začínající noforkem nebo podskupinou. Pokud byste ale použili první výraz grepu bez únikových sekvencí, pak by to bylo hledat konkrétní vzor ne (vidlice | skupina):

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

Můžete také hledat alfanumerické rozsahynebo konkrétní hodnoty, například k vyhledání určitých adres 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

Pokud chcete, můžete použít jiné regulární výrazy a provést konkrétnější vyhledávání. Například | najít jednu náhoda nebo jiný:

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

Můžete dokonce vyhledat velká písmena, malá písmena, pouze abecední znaky nebo alfanumerické znaky atd., s použitím dalších výrazů jako: [: alnum:], [: alfa:], [: číslice:], [: dolní:], [: tisk:], [: punct:], [: mezera:], [ : horní:] atd. Chcete-li například vyhledat velká písmena:
egrep [[:upper:]] diccioario

Doufám, že vám to pomůže ... Brzy vysvětlím regulární výrazy v článku věnovaném konkrétně tomu ...


Zanechte svůj komentář

Vaše e-mailová adresa nebude zveřejněna. Povinné položky jsou označeny *

*

*

  1. Odpovědný za údaje: Miguel Ángel Gatón
  2. Účel údajů: Ovládací SPAM, správa komentářů.
  3. Legitimace: Váš souhlas
  4. Sdělování údajů: Údaje nebudou sděleny třetím osobám, s výjimkou zákonných povinností.
  5. Úložiště dat: Databáze hostovaná společností Occentus Networks (EU)
  6. Práva: Vaše údaje můžete kdykoli omezit, obnovit a odstranit.

  1.   Zástupný obrázek pro Manuel Alcocer řekl

    Dobré odpoledne.

    Několik poznámek ...

    Vysvětlete příkaz „egrep“, ale nedávejte rozdíl mezi „egrep“ a „grep“, což by zde mělo být.

    Například:
    S grep: ip -4 a | grep '[0-9] \ +'
    S egrep: ip -4 a | egrep '[0-9] +'

    Aha, a to je špatně, 'egrep "Hello. * Ahoj" example.txt'; k úspěchu zde dochází, když je v souboru řádek, který obsahuje řetězec „Hello“ následovaný čímkoli a následovaný „sbohem“, řádek může opravdu začínat a končit čímkoli.

    To by řekl článek:
    egrep '^ Hello. * sbohem $' example.txt

    A všechny možnosti, nebo téměř všechny (nepřestávám to kontrolovat), jsou možnosti výhradně „grep“, nikoli „egrep“.

    S pozdravem.

    1.    Isaac řekl

      Děkujeme za nahlášení této chyby. To, co komentujete k regulárním výrazům, jsem již uvedl ve druhém odstavci. Věnuji jim konkrétní článek, protože jich je mnoho a tento článek by trval příliš dlouho. Pozdrav!

      1.    Zástupný obrázek pro Manuel Alcocer řekl

        Ahoj ještě jednou, Isaacu.

        Ve druhém odstavci v podstatě říkáte, nebo jste měli říci, že „egrep“ je alias „grep -E“, ale neuvádíte žádný příklad použití „egrep“ s nějakým regulárním výrazem, který je psán jinak, než když používá 'grep'.

        Věnovat článek vysvětlující rozšířené regulární výrazy se mi zdá odvážné, mimo jiné proto, že existují takové stránky, které neinzerují a dělají velmi důležitou informační práci pro komunitu GNU: https://www.rexegg.com/

        Nepíšu sem pro trollování, mým záměrem s tím vším je, že pokud někdo přečte tento záznam, aby zjistil, co dělá „egrep“ nebo „grep“, podívejte se prosím na jiné zdroje, tento záznam nemůže být odkazem na cokoli, vysvětluje málo, špatně, nabízí nadbytečné informace a může být matoucí, zejména pro ty, kteří nemají znalosti GNU a výkonných nástrojů, které nabízí.

        Nakonec jste přidali a opravili chybu, kterou jsem označil po svém prvním komentáři (^ $). Stejně jako na jiných stránkách jste měli uvést osobu, která provedla opravu, nebo alespoň říci, že se jedná o opravu, která je součástí základny GNU, stejné základny, se kterou byl tento blog spuštěn a byl ztracen.

        Pozdrav.

        1.    Isaac řekl

          Děkuji za váš názor.

  2.   FSAFS řekl

    ffff