Wprowadzenie do grepów i wyrażeń regularnych

Wprowadzenie do grepów i wyrażeń regularnych

Cel

Po przeczytaniu tego samouczka powinieneś być w stanie zrozumieć, jak działa polecenie GREP i jak używać go z podstawowymi i rozszerzonymi wyrażeniami regularnymi.

Trudność

ŁATWY

Wstęp

GREP jest jednym z najbardziej przydatnych narzędzi, których możemy użyć podczas administrowania komputerem opartym na UNIX: jego zadaniem jest wyszukiwanie danego wzoru w jednym lub większej liczbie plików i zwrócenie istniejących dopasowań.

W tym samouczku zobaczymy, jak go używać, a także zbadamy jego warianty: Egrep I FGREP. W pliku umieścimy ten naprawdę słynny fragment książki „The Lord of the Pierścieni” i użyjemy celu dla naszych przykładów:

Trzy pierścienie dla elf-królów pod niebo, siedem dla karłowców w ich kamiennych salach, dziewięć dla śmiertelnych ludzi skazanych na śmierć, jeden dla ciemnego pana na jego ciemnym tronie na krainie Mordor, gdzie leżą cienie. Jeden pierścień, aby rządzić nimi wszystkich, jeden pierścień, aby je znaleźć, jeden pierścień, aby przynieść je wszystkie, a w ciemności wiąże je w krainie Mordor, gdzie leżą cienie. 

Plik zostanie wywołany Lotr.tekst.

Warianty Grep

We wstępie mówiliśmy o dwóch wariantach GREP: Egrep I FGREP. Te warianty są faktycznie przestarzałe, ponieważ są odpowiednikiem biegania GREP z -mi I -F odpowiednio opcje. Zanim zaczniemy wyjaśniać, czym te warianty różnią się od oryginału, musimy zbadać domyślne zachowanie GREP podczas korzystania z wyrażeń regularnych.

Podstawowy tryb wyrażenia regularnego

Wyrażenie regularne to wzorzec skonstruowany zgodnie z określonymi regułami w celu dopasowania ciągu lub wielu ciągów. Domyślnie GREP używa tego, co nazywa Bre lub podstawowe wyrażenia regularne: w tym trybie dostępne są tylko niektóre meta-właściciele (znaki o specjalnym znaczeniu w wyrażeniu regularnym).

Jako pierwszy przykład postaramy się użyć GREP, aby dopasować bardzo prosty ciąg, słowo „śmiertelny”. Składnia GREP jest bardzo prosta: wywołujemy program, podając wzór do dopasowania jako pierwszy argument, a plik docelowy jako drugi:

$ grep śmiertelny Lotr.tekst


Polecenie powyżej nie zwraca żadnych dopasowań, chociaż słowo „śmiertelnik” pojawia się w tekście wrażliwe na przypadek Tak więc, ponieważ słowo „śmiertelnik” jest kapitalizowane, nie pasuje do dostarczonego wzorca. Aby przezwyciężyć ten problem i przeprowadzić bardziej „ogólne” wyszukiwanie, możemy użyć -I opcja (skrót --ignoruj, co sprawia, że ​​Grep ignoruje rozróżnienia przypadków:

$ grep -i śmiertelny Lotr.tekst

Tym razem polecenie tworzy następujące dane wyjściowe (rzeczywisty dopasowanie jest podświetlone na czerwono):

Dziewięć dla śmiertelnych mężczyzn skazanych na śmierć,

Jedną ważną rzeczą do zauważenia jest to, że domyślnie GREP zwraca całą linię, w której znaleziono mecz. To zachowanie można jednak zmodyfikować za pomocą -o opcja lub jej długa wersja --Tylko dopasowanie. Podczas korzystania z tej opcji wydrukuje tylko sam dopasowanie:

$ grep -o -i śmiertelny Lotr.TXT Mortal 

Kolejnym interesującym przełącznikiem, którego możemy użyć -N, krótki --numer kolejki. Gdy używana jest ta opcja, liczba linii, w których znajduje się dopasowanie, jest zawarta w wyjściu GREP. To polecenie:

$ grep -n -i śmiertelny Lotr.tekst

Daje następujące dane wyjściowe:

3: Dziewięć dla śmiertelnych mężczyzn skazanych na śmierć

Gdzie 3 to liczba linii, w której można znaleźć mecz.

Co jeśli chcemy po prostu uzyskać faktyczną liczbę znalezionych meczów, zamiast samych meczów? GREP ma dedykowaną opcję, aby uzyskać ten wynik: -C, Lub --liczyć. Korzystanie z powyższego polecenia z tą opcją zwraca następujące dane wyjściowe:

1

Co, zgodnie z oczekiwaniami, liczba meczów znalezionych w tekście.

Podstawowe meta-właściciele

Czas przeprowadzić nieco bardziej skomplikowane wyszukiwanie. Chcemy teraz znaleźć wszystkie linie zaczynające się na literę „O”. Nawet podczas pracy z podstawowymi wyrażeniami regularnymi możemy użyć ^ znak pasujący do pustego ciągu na początku linii:



$ grep -i ^o lotr.tekst

Zgodnie z oczekiwaniami wynikiem polecenia jest:

Jeden dla Mrocznego Pana na jego ciemnym tronie, jeden pierścień, aby rządzić nimi wszystkich, jeden pierścień, aby je znaleźć, jeden pierścień, aby przynieść je wszystkie, a w ciemności, 

To było dość łatwe. Załóżmy teraz, że chcemy jeszcze bardziej ograniczyć nasze poszukiwania i znaleźć wszystkie linie zaczynające się na „o” i kończące się postacią „”,. Możemy użyć tego przykładu, aby wprowadzić inne meta-właściciele, których możemy użyć w podstawowym trybie Regex:

$ grep -i ^o.*, $ lotr.tekst

Powyższe polecenie Linux zwraca dokładnie to, czego szukaliśmy:

 Jeden pierścień, aby rządzić nimi wszystkich, jeden pierścień, aby je znaleźć, jeden pierścień, aby przynieść je wszystkie, a w ciemności wiąże je,  

Wyjaśnijmy, co zrobiliśmy powyżej. Po pierwsze, użyliśmy -I opcja, aby nasza wyszukiwanie nieczuła przypadek, tak jak w poprzednich przykładach, niż użyliśmy ^ Meta-znak, a następnie „O”, szukając linii zaczynających się od tego listu.

Nie użyliśmy dwóch nowych Meta-właściciele: . I *. Jaka jest ich rola w wyrażeniu regularnym? . odpowiada dowolnej pojedynczej postaci, podczas gdy * jest operatorem powtórzeń, który pasuje do poprzedniego elementu zero lub więcej razy. Wreszcie określiliśmy ,, przecinek, który można dopasować dosłownie jako ostatnią postać przed końcem linii, dopasowana do siebie $ Meta-znak.

Dopasowanie zestawu postaci do kwadratowych nawiasów

W powyższym przykładzie użyliśmy kropki, ., Aby określić wzór, który pasuje do każdej postaci. Co jeśli chcielibyśmy dopasować tylko podzbiór znaków? Powiedzmy na przykład, chcieliśmy znaleźć wszystkie linie, zaczynając od „O” lub „I”: Aby uzyskać taki wynik, możemy załączyć zestaw możliwych postaci do dopasowania w nawiasach kwadratowych:

$ grep -i ^[o, i] lotr.tekst

Polecenie przeprowadzi rozróżnianie przypadków „O” lub „I” znajdujące się na początku wiersza. Oto wynik:

Jeden dla Mrocznego Pana na jego ciemnym tronie w krainie Mordoru, gdzie leżą cienie. Jeden pierścień, aby rządzić nimi wszystkich, jeden pierścień, aby je znaleźć, jeden pierścień, aby przynieść je wszystkie, a w ciemności wiąże je w krainie Mordor, gdzie leżą cienie. 


Aby wzór został dopasowany, jak jest powyżej, należy znaleźć przynajmniej jedną z postaci zawartych w nawiasach. Podczas określania znaków wewnątrz nawiasów kwadratowych możemy również określić zakres za pomocą - postać. Na przykład, aby dopasować cyfry, możemy napisać [0-9]. Wracając do naszego tekstu, możemy użyć tej składni do dopasowania linii, zaczynając od liter od „i” do „s” (nieczuły przypadek):

$ grep -i ^[i -] lotr.tekst

Wyjście polecenia:

Siedem dla karłowców w ich kamiennych salach, dziewięć dla śmiertelnych ludzi skazanych na śmierć, jeden dla Mrocznego Pana na jego ciemnym tronie na krainie Mordoru, gdzie leżą cienie. Jeden pierścień, aby rządzić nimi wszystkich, jeden pierścień, aby je znaleźć, jeden pierścień, aby przynieść je wszystkie, a w ciemności wiąże je w krainie Mordor, gdzie leżą cienie. 

Powyższe to prawie cały tekst wiersza: tylko pierwsza linia, która zaczyna się od litery „T” (nie zawarta w określonym zakresie), została wykluczona z meczu.

W nawiasach kwadratowych możemy dopasować również określone klasy znaków, przy użyciu predefiniowanych Wyrażenia wspornika. Niektóre przykłady to:

  • [: Alnum:] - postacie alfanumeryczne
  • [: cyfra:] - cyfry od 0 do 9
  • [: Lower:] - Niższe litery przypadku
  • [: Upper:] - Górne litery
  • [: puste:] - przestrzenie i zakładki

Powyższa nie jest pełną listą, ale można łatwo znaleźć więcej przykładów wyrażeń wsporników konsultujących się z instrukcją GREP.

Odwrócenie wyniku dopasowania

W powyższych przykładach szukaliśmy każdej linii, zaczynając od „O” lub „I”, używając wyszukiwania niewrażliwego. Co jeśli chcielibyśmy uzyskać przeciwną moc wyjściową, a więc znaleźć tylko linie bez dopasowań?

GREP pozwala nam uzyskać ten wynik za pomocą -v opcja (skrót --WNIRCE-mecz). Opcja, jak sugerowano, instruuje GREP, aby zwrócił odwrócony dopasowanie. Jeśli uruchomimy ostatnie polecenie, którego użyliśmy powyżej, podając tę ​​opcję, powinniśmy uzyskać tylko pierwszy wiersz wiersza jako wyjście. Sprawdźmy to:

$ grep -i -v ^[i -] lotr.tekst

Rezultat jest tak, jak się spodziewaliśmy, tylko pierwsza wiersz wiersza:

Trzy pierścienie dla elf-królów pod niebo,

W naszym przykładzie możemy uzyskać ten sam wynik, poprzedzając listę znaków między nawiasami kwadratowymi z ^ Charakter, który w tym kontekście przyjmuje inne znaczenie, powodując dopasowanie wzoru tylko znaków nie zawartych na liście. Jeśli uruchomimy:

$ grep -i ^[ ^i -] lotr.tekst

Otrzymujemy, takie same wyjście jak poprzednio:

Trzy pierścienie dla elf-królów pod niebo,

Tryb rozszerzonego ekspresji

Używając Egrep lub grep z -mi opcja (ta ostatnia jest zalecanym sposobem), możemy uzyskać dostęp do innych meta-znaków do użycia w wyrażeniach regularnych. Zobaczmy je.



Zaawansowane operatorzy powtórzeń

Spotkaliśmy już * Operator powtórzeń, który jest również dostępny w podstawowym trybie wyrażenia regularnego. Korzystając z rozszerzonych wyrażeń, mamy dostęp do innych tego rodzaju operatorów:

  • ? - dopasowuje element poprzedzający go jeden lub zerowy czas
  • + - pasuje do poprzedniego elementu jeden lub więcej razy

Możemy również określić więcej ziarnistych powtórzeń, używając składni kręconych. Na przykład następujący wzór pasuje do każdego wystąpienia podwójnego „L”:

grep l 2 lort.tekst

Wyjście powyższego polecenia to:

Siedem dla krasnoludów w ich korytarzach kamiennych, jeden pierścień, aby rządzić nimi wszystkich, jeden pierścień, aby je znaleźć, jeden pierścień, aby przynieść je wszystkie, aw ciemności, 

Za pomocą tej samej składni możemy określić minimalną liczbę wystąpień, używając X,, lub cały możliwy zakres, używając x, y, Gdzie X I y reprezentują odpowiednio minimum i maksymalną liczbę powtórzeń poprzedniego elementu.

Alternacja

Podczas pracy z rozszerzonymi wyrażeniami regularnymi mamy również dostęp do | Meta-Charakter, zwany także Inflik operator. Korzystając z niego, możemy dołączyć do dwóch wyrażeń regularnych, tworząc wyrażenie, które pasuje.

Należy zauważyć, że obie strony Inflik Operator zawsze będzie próbował być dopasowany: oznacza to, że ten operator nie działa jako warunkowy Lub Operator, w którym prawa strona jest oceniana tylko wtedy, gdy lewa strona jest fałszywa: można to zweryfikować, obserwując dane wyjściowe następujące polecenie:

$ grep -n -e '^o | l 2' lotr.TXT 2: Seven for the karf-lords w ich salach kamiennych, 4: jeden dla ciemnego pana na jego ciemnym tronie 6: jeden pierścień, aby rządzić nimi wszystkich, jeden pierścień, aby je znaleźć, 7: jeden pierścień, aby przynieść je wszystkie, i w ciemności ich wiążą, 

Obserwuj wyjście: Każda linia zaczyna się od kapitału „O” lub zawierająca podwójne „L”, została uwzględniona w wyjściu. Na liniach 6 I 7, Jednak oba wyrażenia po lewej i prawej stronie Inflik Operator wyprodukował dopasowanie. To, jak wspomniano powyżej, oznacza, że ​​obie strony operatora są oceniane, a jeśli obie wytworzą dopasowanie, oba dopasowania są uwzględnione.

FGREP

Jeśli domyślnie GREP obsługuje podstawowych operatorów wyrażeń regularnych i używając -mi opcja lub Egrep Możemy użyć rozszerzonych wyrażeń regularnych z -F przełącznik (krótki dla -fixed -strings) lub FGREP, Możemy poinstruować program, aby zawsze interpretować wzór jako listę stałych ciągów.

Oznacza to, że sznurki są zawsze próbowane dosłownie dopasowywane, a wszystkie meta-właściciele tracą swoje szczególne znaczenie. Może to być przydatne podczas pracy na tekście lub ciągu, który zawiera wiele znaków, które można uznać za operatorów bez konieczności ucieczki.

Zamykanie myśli

W tym samouczku nauczyliśmy się znać Grep Polecenie UNIX. Widzieliśmy, jak możemy go użyć do znalezienia dopasowań w tekście za pomocą wyrażeń regularnych, a także zbadaliśmy zachowanie jego wariantów: Egrep I FGREP. Zbadaliśmy kilka bardzo przydatnych opcji, takich jak -I, które można użyć do wykonywania wyszukiwań wrażliwych na sprawę.

Wreszcie odbyliśmy wycieczkę po niektórych bardziej używanych operatorach wyrażeń regularnych. GREP jest zdecydowanie jednym z najważniejszych narzędzi systemowych i ma bardzo wyczerpującą dokumentację: konsultacje to zawsze dobry pomysł!

Powiązane samouczki Linux:

  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Advanced Bash Regex z przykładami
  • Mastering Bash Script Loops
  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Zagnieżdżone pętle w skryptach Bash
  • Wyrażenia regularne Pythona z przykładami
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Bash Regexps dla początkujących z przykładami
  • Samouczek debugowania GDB dla początkujących
  • Manipulacja Big Data dla zabawy i zysku Część 3