egrep: przykłady polecenia w systemie GNU / Linux

egrep

grep jest to jedno z najczęściej używanych narzędzi w linii poleceń GNU / Linux. Pomimo tego, że jest bardzo prostym narzędziem, pozwala na wykonanie dużej liczby operacji. Jest używany szczególnie w połączeniu z rurami, aby móc zlokalizować określone punkty na wyjściu poprzedniego polecenia itp. Ale jest też narzędzie znane jako egrep, które jest równoważne uruchomieniu grepa z opcją -E.

E pochodzi od „Rozszerzonego wyrażenia regularnego”, które aktywuje opcję -E i to, co masz domyślnie w egrep bez użycia tej opcji. Oznacza to, że możesz użyć rozszerzone wyrażenia regularne. W tym samouczku nie będę wyjaśniał, czym są wyrażenia regularne, jak można ich używać i jakie typy są w * nix. Pokażę ci tylko praktyczne przykłady przydatnych rzeczy, które możesz zrobić z egrep ...

grep, egrep i fgrep są podobne. W rzeczywistości egrep jest równoważne grep -E, a fgrep jest równoważne grep -F. Oznacza to, że w przypadku, który nas dotyczy, będzie również interpretować wzorce jako wyrażenia regularne.

Państwo wyszukaj linię lub słowo w jednym lub kilku plikach, tak jak ma to miejsce w przypadku grep. Na przykład wyobraź sobie, że chcesz wyszukać słowo ubuntu w pliku o nazwie snap.txt, a także we wszystkich plikach .txt w bieżącym katalogu:

egrep ubuntu snap.txt

egrep ubuntu *.txt

Wyszukiwanie może być również rekurencyjny Aby przeszukać całą zawartość bieżącego katalogu:

egrep -r "hola mundo" *

Do tej pory wyszukiwane były dokładne słowa lub ciągi znaków, to znaczy biorąc pod uwagę duże i małe litery (z uwzględnieniem wielkości liter), ale jeśli chcesz to zrobić w trybie bez rozróżniania wielkości liter, bez względu na to, czy są duże czy małe, możesz użyć następującego (jeśli dodasz w, znajdzie tylko pełne dopasowania):

egrep -i "ejemplo" documento.txt

egrep -iw "ejemplo" documento.txt

Pokaż, nie zbiegów okoliczności, ale nazwy plików, w których znaleziono te dopasowania:

egrep -l hola *.txt

Pokaż tylko wzór lub słowo wyszukiwane w dokumencie:

egrep -o printf hola.c

Pamiętaj, że możesz wykorzystać wszystkie możliwości, jakie możesz sobie wyobrazić. Możesz łączyć kilka wcześniej przedstawionych opcji lub uzupełniać je innymi opcjami, takimi jak -A n i -B n, gdzie n liczba wierszy, które chcesz pokazać przed (przed) i po (po) dopasowania lub obu jednocześnie (C), abyś mógł zobaczyć, co otacza dopasowanie:

egrep -A 2 "printf" hola.c

egrep -B 2 "printf" hola.c

egrep -C 2 printf hola.c

Pomiń wiersze zawierające dopasowanie i wyświetl tylko te, które nie pasują:

egrep -v "dos" números.doc

Lub jeśli wolisz, możesz użyć wiele słów lub dopasowań z -e, Por ejemplo:

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

Jeśli używasz -c może liczyć tylko liczbę dopasowańlub odwróć ją za pomocą -v, aby wyświetlić liczbę niezgodnych wierszy. Na przykład:

egrep -c "include" main.c

egrep -v -c "include" main.c

I nawet pokaż numer linii gdzie doszło do dopasowania, a także miejsce, które zajmuje odpowiednio:

egrep -n "void" hola.c

egrep -o -b "printf" hola.c

Wraz z wyrażenia regularne jego możliwości można rozszerzyć. Na przykład znajdź wiersz zaczynający się od Hello i kończący na bye lub zaczynający się od Hello, po którym następuje cokolwiek, a następnie pojawia się dopasowanie bye:

* Korekta następującego polecenia: dzięki komentarzowi czytelnika Manuela Alcocera udało mi się zmodyfikować następujące polecenie, ponieważ wystąpił błąd.

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

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

Ale jeśli zastanawiasz się nad różnicą w stosunku do grep, oto przykład, który to wyjaśni ... W przypadku używania grep bez -E powinieneś użyć Sekwencje ewakuacyjne tak, że interpretuje znaki specjalne jako takie, w przeciwnym razie zinterpretowałby wzorzec jako taki bez ich uwzględniania. Z drugiej strony, z egrep lub grep -E weźmie je pod uwagę. Na przykład:
grep '^no\(fork\|group\)' /etc/group

Byłoby to równoważne z:

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

Oznacza to, że szukałby pasujących linii zaczynających się od nofork lub nogroup. Ale jeśli użyjesz pierwszego wyrażenia grepa bez sekwencji ucieczki, to co zrobi to wyszukiwanie wzór betonu nie (widelec | grupa):

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

Możesz także wyszukiwać zakresy alfanumerycznelub określone wartości, takie jak lokalizowanie określonych adresów 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

Jeśli wolisz, możesz użyć innych wyrażeń regularnych, aby przeprowadzić bardziej szczegółowe wyszukiwania. Na przykład | znaleźć jeden zbieg okoliczności lub inny:

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

Możesz nawet zlokalizować wielkie, małe litery, tylko znaki alfabetyczne lub alfanumeryczne itp., używając innych wyrażeń, takich jak: [: alnum:], [: alpha:], [: digit:], [: lower:], [: print:], [: punct:], [: space:], [ : górny:] itp. Na przykład, aby wyszukać wielkie litery:
egrep [[:upper:]] diccioario

Mam nadzieję, że ci to pomoże ... Wkrótce wyjaśnię wyrażenia regularne w poświęconym im artykule ...


5 komentarzy, zostaw swoje

Zostaw swój komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*

*

  1. Odpowiedzialny za dane: Miguel Ángel Gatón
  2. Cel danych: kontrola spamu, zarządzanie komentarzami.
  3. Legitymacja: Twoja zgoda
  4. Przekazywanie danych: Dane nie będą przekazywane stronom trzecim, z wyjątkiem obowiązku prawnego.
  5. Przechowywanie danych: baza danych hostowana przez Occentus Networks (UE)
  6. Prawa: w dowolnym momencie możesz ograniczyć, odzyskać i usunąć swoje dane.

  1.   Symbol zastępczy dla Manuel Alcocer powiedział

    Dzień dobry.

    Kilka uwag ...

    Wyjaśniasz działanie polecenia „egrep”, ale nie umieszczasz różnicy między „egrep” a „grep”, które powinno być tutaj.

    Na przykład:
    Z grep: ip -4 a | grep „[0–9] \ +”
    Z egrep: ip -4 a | egrep „[0–9] +”

    Ach, a to jest złe, 'egrep "Hello. * Bye" example.txt'; sukces występuje w tym przypadku, gdy w pliku znajduje się linia zawierająca ciąg „Hello”, po którym następuje cokolwiek, a po nim „goodbye”, wiersz może naprawdę zaczynać się i kończyć czymkolwiek.

    Oto, co mówi artykuł:
    egrep '^ Hello. * bye $' example.txt

    A wszystkie opcje, lub prawie wszystkie (nie zatrzymuję się, aby to sprawdzić), są opcjami „grep”, a nie wyłącznie „egrep”.

    Z poważaniem.

    1.    Isaac powiedział

      Dziękujemy za zgłoszenie tego błędu. To, co komentujesz na temat wyrażeń regularnych, umieściłem już w drugim akapicie. Poświęcę im konkretny artykuł, ponieważ jest ich wiele i ten artykuł trwałby zbyt długo. Pozdrowienie!

      1.    Symbol zastępczy dla Manuel Alcocer powiedział

        Witam ponownie, Izaaku.

        W drugim akapicie w zasadzie mówisz lub powinieneś był powiedzieć, że „egrep” jest aliasem „grep -E”, ale nie podajesz żadnego przykładu użycia „egrep” z jakimś wyrażeniem regularnym, które jest napisane inaczej niż gdy używany przez „grep”.

        Poświęcenie artykułu wyjaśniającego rozszerzone wyrażenia regularne wydaje mi się odważne, między innymi dlatego, że istnieją takie witryny, które nie reklamują się i wykonują bardzo ważną pracę informacyjną dla społeczności GNU: https://www.rexegg.com/

        Nie piszę tutaj dla trollingu, moim zamiarem jest to, że jeśli ktoś przeczyta ten wpis, aby zobaczyć, co robi 'egrep' lub 'grep', spójrz na inne źródła, ten wpis nie może być odniesieniem do niczego, niewiele wyjaśnia niestety, oferuje zbędne informacje i może być mylące, szczególnie dla tych, którzy nie mają wiedzy o GNU i potężnych narzędziach, które oferuje.

        Wreszcie dodałeś i naprawiłeś błąd, który wskazałem po moim pierwszym komentarzu (^ $). Podobnie jak w innych witrynach, powinieneś był zacytować osobę, która dokonała korekty, lub przynajmniej powiedzieć, że jest to poprawka, czyli część bazy GNU, tej samej bazy, z której ten blog został założony i został utracony.

        Pozdrowienia.

        1.    Isaac powiedział

          Dziękuję za Twój punkt widzenia.

  2.   fsafs powiedział

    ffff