egrep: примери за командата в GNU / Linux

егреп

Впиши това е един от най-използваните инструменти в командния ред на GNU / Linux. Въпреки че е много прост инструмент, той ви позволява да извършвате голям брой операции. Използва се особено заедно с тръби, за да може да се намерят конкретни точки в изхода на предишна команда и т.н. Но има и инструмент, известен като egrep, който е еквивалентен на стартирането на grep с опцията -E.

E идва от "Разширено регулярно изражение", което активира опцията -E и това, което имате в egrep по подразбиране, без да използвате тази опция. Това означава, че можете да използвате разширени регулярни изрази. В този урок няма да навлизам в обяснението какво представляват регулярните изрази, как могат да се използват и какви типове са в * nix. Ще покажа само практически примери за някои полезни неща, които можете да направите с egrep ...

grep, egrep и fgrep са подобни. Всъщност egrep е еквивалентно на grep -E, а fgrep е еквивалентно на grep -F. Тоест, в случая, който ни касае, той също ще интерпретира моделите като регулярни изрази.

Ви търсене на ред или дума в един или повече файлове, какъвто е случаят и с grep. Например, представете си, че искате да търсите думата ubuntu във файл с име snap.txt, а също и във всички .txt файлове в текущата директория:

egrep ubuntu snap.txt

egrep ubuntu *.txt

Търсенето също може да бъде рекурсивен За да търсите цялото съдържание на текущата директория:

egrep -r "hola mundo" *

Досега бяха търсени точни думи или низове, тоест като се вземат предвид главни и малки букви (чувствителни към малки и големи букви), но ако искате да го направите в режим без чувствителност към регистъра, без значение дали са главни или малки, можете да използвате следното (ако добавите w, той намира само пълни съвпадения):

egrep -i "ejemplo" documento.txt

egrep -iw "ejemplo" documento.txt

Покажете, не съвпаденията, но имената на файловете, в които са намерени тези съвпадения:

egrep -l hola *.txt

Показвайте само шаблона или думата търсено в документ:

egrep -o printf hola.c

Не забравяйте, че можете да използвате всички възможности, които можете да си представите. Можете да комбинирате няколко от предишните опции или да ги допълните с други опции като -A n и -B n, където n броят на редовете, които искате да покажете преди (преди) и след (след) на мача или и двете едновременно (C), за да можете да видите какво заобикаля мача:

egrep -A 2 "printf" hola.c

egrep -B 2 "printf" hola.c

egrep -C 2 printf hola.c

Потиснете редовете, които съдържат съвпадение и показват само тези, които не съвпадат:

egrep -v "dos" números.doc

Или ако предпочитате, можете да използвате множество думи или съвпадения с -e, Например:

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

Ако използвате -c може да брои само броя на съвпаденията, или го обърнете с -v, за да покажете броя на несъответстващите редове. Например:

egrep -c "include" main.c

egrep -v -c "include" main.c

И дори покажи номера на реда където е настъпил мачът, а също и позицията, която заема съответно:

egrep -n "void" hola.c

egrep -o -b "printf" hola.c

И заедно с регулярни изрази неговите възможности могат да бъдат разширени. Например, намерете ред, който започва с Hello и завършва с bye, или който започва с Hello, последван от каквото и след това се показва съответно bye:

* Корекция на следната команда: благодарение на коментара на читателя Manuel Alcocer успях да модифицирам следната команда, тъй като имаше грешка.

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

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

Но ако се чудите каква е разликата с grep, ето пример, който ще стане ясно ... В случай на използване на grep без -E трябва да използвате изходни последователности така че да интерпретира специалните символи като такива, в противен случай би интерпретирал шаблона като такъв, без да ги взема под внимание. От друга страна, с egrep или grep -E ще ги вземе предвид. Например:
grep '^no\(fork\|group\)' /etc/group

Това би било еквивалентно на:

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

Тоест, ще търси съответстващите редове, започващи с nofork или nogroup. Но ако сте използвали първия израз на grep без изходните последователности, това, което би направил, е да търсите конкретния модел не (вилица | група):

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

Можете също да търсите буквено-цифрови диапазони, или конкретни стойности, като например за намиране на определени 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

Ако предпочитате, можете да използвате други регулярни изрази, за да извършвате по-конкретни търсения. Например | да се намери такъв съвпадение или другото:

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

Можете дори да намерите главни, малки букви, само азбучни символи или буквено-цифрови и др., използвайки други изрази като: [: alnum:], [: алфа:], [: цифра:], [: по-ниска:], [: печат:], [: точен:], [: интервал:], [: горен:] и др. Например, за да търсите главни букви:
egrep [[:upper:]] diccioario

Надявам се да ви помогне ... Скоро ще обясня регулярни изрази в статия, посветена специално на него ...


5 коментара, оставете своя

Оставете вашия коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

*

*

  1. Отговорен за данните: Мигел Анхел Гатон
  2. Предназначение на данните: Контрол на СПАМ, управление на коментари.
  3. Легитимация: Вашето съгласие
  4. Съобщаване на данните: Данните няма да бъдат съобщени на трети страни, освен по законово задължение.
  5. Съхранение на данни: База данни, хоствана от Occentus Networks (ЕС)
  6. Права: По всяко време можете да ограничите, възстановите и изтриете информацията си.

  1.   Мануел Алкосер каза той

    Добър ден.

    Няколко забележки ...

    Обяснявате командата 'egrep', но не поставяте разликата между 'egrep' и 'grep', което трябва да е това, което е тук.

    Например:
    С grep: ip -4 a | grep '[0-9] \ +'
    С egrep: ip -4 a | egrep '[0-9] +'

    Ааа, и това е грешно, 'egrep "Здравейте. * Чао" example.txt'; успехът тук се случва, когато във файла има ред, който съдържа низа „Здравейте“, последван от каквото и последван от „довиждане“, редът наистина може да започва и завършва с каквото и да било.

    В статията се казва това:
    egrep '^ Здравей. * чао $' example.txt

    И всички опции, или почти всички (не спирам да го проверявам), са опции на 'grep', а не само на 'egrep'.

    С най-добри пожелания.

    1.    Isaac каза той

      Благодарим ви, че докладвахте за тази грешка. Това, което коментирате за регулярните изрази, вече го поставих във втория абзац. Ще им посветя конкретна статия, защото има много и тази статия ще отнеме твърде много време. Поздрав!

      1.    Мануел Алкосер каза той

        Здравейте отново, Исак.

        Във втория параграф основно казвате или би трябвало да кажете, че „egrep“ е псевдоним на „grep -E“, но не давате никакъв пример за използване на „egrep“ с някакъв регулярен израз, който е написан по различен начин, отколкото когато се използва от „ grep '.

        Посвещаването на статия за обяснение на разширени регулярни изрази ми се струва смело, наред с други неща, защото има сайтове като този, които не рекламират и извършват много важна информационна работа за общността на GNU: https://www.rexegg.com/

        Не пиша тук за тролинг, целта ми с всичко това е, че ако някой прочете този запис, за да види какво прави „egrep“ или „grep“, моля, погледнете други източници, този запис не може да бъде препратка към нищо, обяснява малко, лошо , предлага излишна информация и може да обърка, особено за тези, които нямат познания за GNU и мощните инструменти, които предлага.

        И накрая, добавихте и коригирахте грешката, която посочих след първия си коментар (^ $). Както и в други сайтове, трябваше да цитирате човека, който е направил корекцията, или поне да кажете, че това е корекция, която е част от базата на GNU, същата база, с която този блог е стартиран и е бил изгубени.

        За поздрав.

        1.    Isaac каза той

          Благодаря ви за вашата гледна точка.

  2.   fsafs каза той

    ffff