Używanie grep (i egrep) z wyrażeniami regularnymi

Using Grep With Regular Expressions



Ten samouczek opisuje, jak korzystać z obu chwyt (oraz egrep) t o znaleźć tekst w plikach, w ich prostej formie iw połączeniu z wyrażeniami regularnymi. Zawiera kilka przykłady oraz ćwiczenia , jeszcze rozwiązania , do ukończenia przez widza.

Imię chwyt pochodzi z polecenia ed (i vim) g/re/p, co oznacza globalne wyszukiwanie podanego wyrażenia regularnego i wyświetlenie (wyświetlenie) wyniku.







Regularny Wyrażenia

Narzędzia umożliwiają użytkownikowi wyszukiwanie w plikach tekstowych wierszy pasujących do wyrażenia regularnego ( wyrażenie regularne ). Wyrażenie regularne to ciąg wyszukiwania składający się z tekstu i co najmniej jednego z 11 znaków specjalnych. Prostym przykładem jest dopasowanie początku linii.



Przykładowy plik

Podstawowa forma chwyt może służyć do wyszukiwania prostego tekstu w określonym pliku lub plikach. Aby wypróbować przykłady, najpierw utwórz przykładowy plik.



Użyj edytora, takiego jak nano lub vim, aby skopiować poniższy tekst do pliku o nazwie mój plik .





xyz
xyzde
exyzd
dexyz
d?gxyz
xxz
xzz
xz
x*z
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
xyyyyz

Chociaż możesz kopiować i wklejać przykłady w tekście (zwróć uwagę, że podwójne cudzysłowy mogą nie być kopiowane poprawnie), polecenia należy wpisać, aby prawidłowo się ich nauczyć.

Przed wypróbowaniem przykładów obejrzyj przykładowy plik:



$Kotmój plik

Proste wyszukiwanie

Aby znaleźć tekst „xyz” w pliku, uruchom następujące polecenie:

$chwytxyz mój plik

Korzystanie z kolorów

Aby wyświetlić kolory, użyj opcji –color (podwójny myślnik) lub po prostu utwórz alias. Na przykład:

$chwyt --kolorxyz mój plik

lub

$Alias chwyt= ’chwyt--kolor'
$chwytxyz mój plik

Opcje

Typowe opcje używane z chwyt polecenie zawiera:

  • -znajduję wszystkie linie niezależny walizkowy
  • -C liczyć ile wierszy zawiera tekst
  • -n linia wyświetlacza liczby pasujących linii
  • -l tylko wyświetlacz plik nazwy Ten mecz
  • -r rekursywny przeszukiwanie podkatalogów
  • -v znajdź wszystkie linie NIE zawierający tekst

Na przykład:

$chwyt -ixyz mój plik# znajdź tekst niezależnie od wielkości liter

$chwyt -icxyz mój plik# policz linie z tekstem

$chwyt -wxyz mój plik# pokaż numery linii

Utwórz wiele plików

Zanim spróbujesz przeszukać wiele plików, utwórz kilka nowych plików:

$wyrzuciłxyz>mójplik1
$wyrzucił -Ixyz xzz XYZ>mójplik2
$wyrzucił -Ixxx rrr>mójplik3
$Kotmójplik1
$Kotmójplik2
$Kotmójplik3

Wyszukaj wiele plików

Aby wyszukać wiele plików przy użyciu nazw plików lub symbolu wieloznacznego, wprowadź:

$chwyt -icxyz mojplik mojplik1 mojplik2 mojplik3
$chwyt -wxyz mój*
# pasuje do nazw plików zaczynających się od „mój”

Ćwiczenie I

  1. Najpierw policz ile linii znajduje się w pliku /etc/passwd.
Podpowiedź: użyjtoaleta -ten /itp/hasło
  1. Teraz znajdź wszystkie wystąpienia tekstu gdzie w pliku /etc/passwd .
  2. Sprawdź, ile wierszy w pliku zawiera tekst
  3. Sprawdź, ile wierszy NIE zawiera tekstu gdzie .
  4. Znajdź wpis dla swojego loginu w /etc/passwd

Rozwiązania ćwiczeń znajdziesz na końcu tego artykułu.

Korzystanie z wyrażeń regularnych

Komenda chwyt mogą być również używane z wyrażeniami regularnymi, używając jednego lub więcej z jedenastu znaków specjalnych lub symboli w celu zawężenia wyszukiwania. Wyrażenie regularne to ciąg znaków, który zawiera znaki specjalne umożliwiające dopasowanie wzorców w narzędziach, takich jak chwyt , przyszedłem oraz sed . Zauważ, że łańcuchy mogą wymagać ujęcia w cudzysłów.

Dostępne znaki specjalne obejmują:

^ Początek linii
$ Koniec linii
. Dowolny znak (z wyjątkiem nowej linii)
* 0 lub więcej poprzedniego wyrażenia
Poprzedzenie symbolu sprawia, że ​​jest to znak dosłowny

Zauważ, że *, którego można użyć w wierszu poleceń, aby dopasować dowolną liczbę znaków, w tym żaden, to nie używane w ten sam sposób tutaj.

Zwróć także uwagę na użycie cudzysłowów w poniższych przykładach.

Przykłady

Aby znaleźć wszystkie wiersze zaczynające się od tekstu za pomocą znaku ^:

$chwyt‘^xyz’ mój plik

Aby znaleźć wszystkie wiersze kończące się tekstem za pomocą znaku $:

$chwyt„xyz$” mój plik

Aby znaleźć wiersze zawierające ciąg znaków, używając zarówno znaków ^, jak i $:

$chwyt‘^xyz$’ mój plik

Aby znaleźć linie za pomocą . aby dopasować dowolny znak:

$chwyt‘^x.z’ mójplik

Aby znaleźć wiersze za pomocą *, aby dopasować 0 lub więcej poprzedniego wyrażenia:

$chwyt‘^xy*z 'mój plik

Aby znaleźć wiersze za pomocą .*, aby dopasować 0 lub więcej dowolnego znaku:

$chwyt„^ X.*z 'mój plik

Aby znaleźć linie za pomocą aby uciec od znaku *:

$chwyt„^ X *z 'mój plik

Aby znaleźć znak , użyj:

$chwyt'\' mój plik

Wyrażenie grep – egrep

ten chwyt polecenie obsługuje tylko podzbiór dostępnych wyrażeń regularnych. Jednak polecenie egrep:

  • umożliwia pełne wykorzystanie wszystkich wyrażeń regularnych
  • może jednocześnie wyszukiwać więcej niż jedno wyrażenie

Zauważ, że wyrażenia muszą być ujęte w cudzysłów.

Aby użyć kolorów, użyj opcji –color lub ponownie utwórz alias:

$Alias egrep='egrep --kolor'

Aby wyszukać więcej niż jeden wyrażenie regularne ten egrep polecenie może być napisane w wielu wierszach. Można to jednak zrobić również za pomocą tych znaków specjalnych:

| Naprzemienne, jedno lub drugie
(…) Logiczne grupowanie części wyrażenia
$egrep '(^root|^uucp|^poczta)' /itp/hasło

Wyciąga z pliku linie zaczynające się od root, uucp lub mail, | symbol oznaczający jedną z opcji.

Następujące polecenie spowoduje: nie działa, chociaż nie jest wyświetlany żaden komunikat, ponieważ podstawowy chwyt polecenie nie obsługuje wszystkich wyrażeń regularnych:

$chwyt '(^root|^uucp|^poczta)' /itp/hasło

Jednak w większości systemów Linux polecenie grep -E to to samo, co używanie egrep :

$chwyt -ORAZ '(^root|^uucp|^poczta)' /itp/hasło

Korzystanie z filtrów

Rurociąg to proces wysyłania danych wyjściowych jednego polecenia jako dane wejściowe do innego polecenia i jest jednym z najpotężniejszych dostępnych narzędzi systemu Linux.

Polecenia pojawiające się w potoku są często nazywane filtrami, ponieważ w wielu przypadkach przesiewają lub modyfikują dane wejściowe przekazane do nich przed wysłaniem zmodyfikowanego strumienia na standardowe wyjście.

W poniższym przykładzie standardowe wyjście z ls-l jest przekazywany jako standardowe wejście do chwyt Komenda. Wyjście z chwyt polecenie jest następnie przekazywane jako dane wejściowe do jeszcze Komenda.

Spowoduje to wyświetlenie tylko katalogów w /itp :

$ls -ten /itp|chwyt„^d”|jeszcze

Poniższe polecenia są przykładami użycia filtrów:

$ps -ef|chwytcron

$który|chwytkdm

Przykładowy plik

Aby wypróbować ćwiczenie przeglądu, najpierw utwórz następujący przykładowy plik.

Użyj edytora, takiego jak nano lub vim, aby skopiować poniższy tekst do pliku o nazwie ludzie:

Osobisty J.Smith 25000
Osobisty E.Smith 25400
Szkolenie A.Brown 27500
Szkolenie C.Browen 23400
(Administrator) R.Bron 30500
Towar wyprzedaż T.Smyth 30000
Osobisty F.Jones 25000
szkolenie* C.Evans 25500
Goodout W.Papież 30400
Parter T.Smythe 30500
Personel J.Maler 33000

Ćwiczenie II

  1. Wyświetl plik ludzie i zbadaj jego zawartość.
  2. Znajdź wszystkie wiersze zawierające ciąg Kowal w pliku people.Podpowiedź: użyj polecenia grep, ale pamiętaj, że domyślnie rozróżniana jest wielkość liter.
  3. Utwórz nowy plik, npeople, zawierający wszystkie linie zaczynające się od łańcucha Osobisty w pliku osób.Wskazówka: użyj polecenia grep z >.
  4. Potwierdź zawartość pliku npeople, wyświetlając plik.
  5. Teraz dołącz wszystkie wiersze, w których tekst kończy się ciągiem 500 w pliku people do pliku npeople.Podpowiedź: użyj polecenia grep z >>.
  6. Ponownie potwierdź zawartość pliku npeople, wyświetlając plik.
  7. Znajdź adres IP serwera, który jest przechowywany w pliku /etc/hosty .Podpowiedź: użyj polecenia grep z $(nazwa hosta)
  8. Posługiwać się egrep wyodrębnić z /etc/passwd wiersze konta pliku zawierające lp lub twój własny identyfikator użytkownika .

Rozwiązania ćwiczeń znajdziesz na końcu tego artykułu.

Więcej wyrażeń regularnych

Wyrażenie regularne można traktować jako symbole wieloznaczne na sterydach.

Istnieje jedenaście znaków o specjalnym znaczeniu: otwierający i zamykający nawias kwadratowy [ ], ukośnik odwrotny , karetka ^, znak dolara $, kropka lub kropka ., pionowa kreska lub symbol kreski pionowej |, znak zapytania ?, znak gwiazdka lub gwiazdka *, znak plus + oraz otwierający i zamykający nawias okrągły { }. Te znaki specjalne są również często nazywane metaznakami.

Oto pełny zestaw znaków specjalnych:

^ Początek linii
$ Koniec linii
. Dowolny znak (z wyjątkiem nowej linii)
* 0 lub więcej poprzedniego wyrażenia
| Naprzemienne, jedno lub drugie
[…] Wyraźny zestaw znaków do dopasowania
+ 1 lub więcej poprzedniego wyrażenia
? 0 lub 1 poprzedniego wyrażenia
Poprzedzenie symbolu sprawia, że ​​jest to znak dosłowny
{…} Jawna notacja kwantyfikatora
(…) Logiczne grupowanie części wyrażenia

Domyślna wersja chwyt ma tylko ograniczoną obsługę wyrażeń regularnych. Aby wszystkie poniższe przykłady działały, użyj egrep zamiast tego lub grep -E .

Aby znaleźć linie za pomocą | aby dopasować dowolne wyrażenie:

$egrep„xxz”|xzz’ mój plik

Aby znaleźć linie za pomocą | aby dopasować dowolne wyrażenie w ciągu, użyj również ( ):

$egrep‘^ X(Yz|yz)' mój plik

Aby znaleźć wiersze za pomocą [ ], aby dopasować dowolny znak:

$egrep‘^ X[Yy]z 'mój plik

Aby znaleźć wiersze za pomocą [ ], aby NIE dopasować żadnego znaku:

$egrep‘^ X[^ Yy]z 'mój plik

Aby znaleźć wiersze za pomocą *, aby dopasować 0 lub więcej poprzedniego wyrażenia:

$egrep‘^xy*z 'mój plik

Aby znaleźć wiersze za pomocą +, aby dopasować 1 lub więcej poprzedniego wyrażenia:

$egrep‘^xy+z’ mój plik

Aby znaleźć wiersze za pomocą ? aby dopasować 0 lub 1 poprzedniego wyrażenia:

$egrep‘^xy?z’ mójplik

Ćwiczenie III

  1. Znajdź wszystkie wiersze zawierające nazwiska Evans lub malarz w aktach osób.
  2. Znajdź wszystkie wiersze zawierające nazwiska Smith, Smyth lub Smythe w aktach osób.
  3. Znajdź wszystkie wiersze zawierające nazwiska Brązowy, Brązowy lub Źródło w pliku osób. Jeśli masz czas:
  4. Znajdź linię zawierającą ciąg (Administrator), w tym nawiasy, w teczce osób.
  5. Znajdź wiersz zawierający znak * w pliku people.
  6. Połącz 5 i 6 powyżej, aby znaleźć oba wyrażenia.

Więcej przykładów

Aby znaleźć linie za pomocą . i * aby dopasować dowolny zestaw znaków:

$egrep‘^xy.*z 'mój plik

Aby znaleźć wiersze za pomocą { }, aby dopasować liczbę N znaków:

$egrep‘^xy{3}z 'mój plik
$egrep‘^xy{4}z 'mój plik

Aby znaleźć wiersze za pomocą { }, aby dopasować N lub więcej razy:

$egrep‘^xy{3,}z 'mój plik

Aby znaleźć linie za pomocą { }, aby dopasować N razy, ale nie więcej niż M razy:

$egrep‘^xy{2,3}z 'mój plik

Wniosek

W tym samouczku najpierw przyjrzeliśmy się używaniu chwyt w prostej formie, aby znaleźć tekst w pliku lub w wielu plikach. Następnie połączyliśmy szukany tekst z prostymi wyrażeniami regularnymi, a następnie z bardziej złożonymi, używając egrep .

Następne kroki

Mam nadzieję, że zdobytą tu wiedzę dobrze wykorzystacie. Spróbować chwyt poleceń na własnych danych i pamiętaj, że opisane tutaj wyrażenia regularne mogą być używane w tej samej formie w my , sed oraz awk !

Rozwiązania do ćwiczeń

Ćwiczenie I

Najpierw policz, ile wierszy jest w pliku /etc/passwd .
$ wc -l /etc/passwd
Teraz znajdź wszystkie wystąpienia tekstu gdzie w pliku /etc/passwd.
$ grep var /etc/passwd
Sprawdź, ile wierszy w pliku zawiera tekst gdzie

chwyt -Cgdzie/itp/hasło

Sprawdź, ile wierszy NIE zawiera tekstu gdzie .

chwyt -cvgdzie/itp/hasło

Znajdź wpis dla swojego loginu w /etc/passwd plik
grep kdm /etc/passwd

Ćwiczenie II

Wyświetl plik ludzie i zbadaj jego zawartość.
$ cat people
Znajdź wszystkie wiersze zawierające ciąg Kowal w pliku ludzie .
$ grep 'Smith' people
Utwórz nowy plik, nludzie , zawierający wszystkie linie zaczynające się od łańcucha Osobisty w ludzie plik
$ grep '^Personal' people> npeople
Potwierdź zawartość pliku nludzie wypisując plik.
$ cat npeople
Teraz dołącz wszystkie wiersze, w których tekst kończy się ciągiem 500 w pliku ludzie do pliku nludzie .
$ grep '500$' people>>npeople
Ponownie potwierdź zawartość pliku nludzie wypisując plik.
$ cat npeople
Znajdź adres IP serwera, który jest przechowywany w pliku /etc/hosty .
$ grep $(hostname) /etc/hosts
Posługiwać się egrep wyodrębnić z /etc/passwd wiersze konta pliku zawierające lp lub własny identyfikator użytkownika.
$ egrep '(lp|kdm:)' /etc/passwd

Ćwiczenie III

Znajdź wszystkie wiersze zawierające nazwiska Evans lub malarz w pliku ludzie .
$ egrep 'Evans|Maler' people
Znajdź wszystkie wiersze zawierające nazwiska Kowal , Smyth lub Smythe w pliku ludzie .
$ egrep 'Sm(i|y)the?' people
Znajdź wszystkie wiersze zawierające nazwiska brązowy , Brązowy lub Źródło w aktach osób.
$ egrep 'Brow?e?n' people
Znajdź linię zawierającą ciąg (Administrator), w tym nawiasy, w pliku ludzie .

$egrep '(Administrator)'ludzie

Znajdź linię zawierającą znak * w aktach osób.
$ egrep '*' people
Połącz 5 i 6 powyżej, aby znaleźć oba wyrażenia.

$egrep '(Administrator)|*'ludzie