Używanie GREP z wyrażeniami regularnymi

Używanie GREP z wyrażeniami regularnymi
Ten samouczek opisuje, jak używać obu Grep (I egrep) to Znajdź tekst w plikach, w ich prostej formie i w połączeniu z wyrażeniami regularnymi. Zawiera kilka przykłady I Ćwiczenia, plus rozwiązania, Aby widz mógł się ukończyć.

Imię Grep Pochodzi z polecenia ED (i VIM) „g/re/p”, co oznacza globalne wyszukiwanie danego wyrażenia regularnego i drukowania (wyświetlania) wyjścia.

Regularny Wyrażenia

Narzędzia umożliwiają użytkownikowi wyszukiwanie plików tekstowych w poszukiwaniu linii pasujących do wyrażenia regularnego (Regexp). Wyrażenie regularne to ciąg wyszukiwania złożony z tekstu i jeden lub więcej z 11 znaków specjalnych. Prostym przykładem jest dopasowanie początku linii.

Przykładowy plik

Podstawowa forma Grep może być używane do znalezienia 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
x \ z
x*z
xz
x z
XYZ
Xyyz
XYZ
xyyz
Xyyyz
Xyyyyz

Chociaż możesz kopiować i wkleić przykłady w tekście (pamiętaj, że podwójne cytaty mogą nie kopiować poprawnie), należy wpisać polecenia, aby ich prawidłowo się nauczyć.

Przed wypróbowaniem przykładów wyświetl przykładowy plik:

Cat myfile
XYZ
Xyzde
Exyzd
Dexyz
D?gxyz
xxz
xzz
x \ z
x*z
xz
x z
XYZ
Xyyz
XYZ
xyyz
Xyyyz
Xyyyyz

Proste wyszukiwanie

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

Grep Xyz Myfile
XYZ
Xyzde
Exyzd
Dexyz
D?gxyz

Opcje

Typowe opcje używane z Grep Polecenie obejmuje:

  • -Znajduję wszystkie linie niezależny przypadkowy
  • -C liczyć Ile linii zawiera tekst
  • -n Linia wyświetlacza liczby pasujących linii
  • -tylko Wyświetlacz plik nazwy Ten mecz
  • -R rekurencyjny Wyszukaj podajowce
  • -v Znajdź wszystkie linie NIE zawierający tekst

Na przykład:

grep -i xyz myfile
# Znajdź tekst niezależnie od przypadku
XYZ
Xyzde
Exyzd
Dexyz
D?gxyz
XYZ
XYZ
grep -ic xyz myfile
# Linie liczą z tekstem
7
grep -in xyz myfile
# Pokaż numery linii
1: XYZ
2: Xyzde
3: Exyzd
4: Dexyz
5: D?gxyz
12: XYZ
14: Xyz

Utwórz wiele plików

Przed próbą wyszukiwania wielu plików najpierw utwórz kilka nowych plików:

echo xyz> myfile1
Cat myfile1
XYZ
echo -e 'xyz \ nxzz \ nxyz'> myfile2
Cat myfile2
XYZ
xzz
XYZ
echo -e 'xxx \ nyyy'> myfile3
Cat myfile3
xxx
Ja

Wyszukaj wiele plików

Aby wyszukiwać wiele plików za pomocą nazwy plików lub Enter do Wildcard:

grep -ic xyz myfile myfile1 myfile2 myfile3
Myfile: 7
Myfile1: 1
Myfile2: 2
myfile3: 0
# Dopasuj nazwy plików zaczynające się od „my”
grep -in xyz my*
myfile: 1: xyz
myfile: 2: xyzde
Myfile: 3: Exyzd
Myfile: 4: Dexyz
Myfile: 5: D?gxyz
myfile: 12: xyz
myfile: 14: xyz
myfile1: 1: xyz
myfile2: 1: xyz
myfile2: 3: xyz

Ćwiczenie

  1. Najpierw policz liczbę linii w pliku /etc /passwd.
Wskazówka: użyj WC -L /etc /Passwd
  1. Teraz znajdź wszystkie wystąpienia tekstu var w pliku /etc /passwd.
  2. Znajdź liczbę linii w pliku zawiera tekst
  3. Znajdź, ile wierszy nie zawiera tekstu var.
  4. Znajdź wpis do logowania w /etc/passwd

Rozwiązania ćwiczeń można znaleźć na końcu tego artykułu.

Korzystanie z wyrażeń regularnych

Komenda Grep może być również używane z wyrażeniami regularnymi przy użyciu jednego lub więcej jedenastu znaków specjalnych lub symboli do udoskonalenia wyszukiwania. Wyrażenie regularne to ciąg znaków, który zawiera znaki specjalne, aby umożliwić dopasowywanie wzorców w narzędzia, takie jak Grep, krzepa I sed. Zauważ, że sznurki mogą wymagać zamknięcia w cytatach.

Dostępne znaki specjalne obejmują:

^ Początek linii
$ Koniec linii
. Każda postać (z wyjątkiem nowej linii)
* 0 lub więcej poprzedniego wyrażenia
\ Poprzedzający symbol czyni go dosłownym postacią

Zauważ, że *, które mogą być używane w wierszu poleceń w celu dopasowania dowolnej liczby znaków, w tym Brak, jest nie używane w ten sam sposób tutaj.

Zwróć również uwagę na użycie cytatów w następujących przykładach.

Przykłady

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

grep '^xyz' myfile

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

grep „xyz $” myfile

Aby znaleźć linie zawierające ciąg przy użyciu znaków ^ i $:

grep '^xyz $' myfile

Aby znaleźć linie za pomocą . Aby dopasować dowolną postać:

grep '^x.Z 'myfile

Aby znaleźć linie za pomocą * do dopasowania 0 lub więcej poprzedniego wyrażenia:

grep '^xy*z' myfile

Aby znaleźć linie za pomocą .* Aby dopasować 0 lub więcej dowolnej postaci:

grep '^x.*Z 'myfile

Aby znaleźć linie za pomocą \ Unikać * postaci:

grep '^x \*z' myfile

Aby znaleźć użycie postaci:

grep „\\” myfile

Wyrażenie grep - egrep

Grep Polecenie obsługuje tylko podzbiór dostępnych wyrażeń regularnych. Jednak polecenie Egrep:

  • umożliwia pełne użycie wszystkich wyrażeń regularnych
  • może jednocześnie szukać więcej niż jednego wyrażenia

Zauważ, że wyrażenia muszą być zamknięte w parach cytatów.

Aby poszukać więcej niż jednego Regex Egrep Polecenie może być zapisane w wielu wierszach. Można to jednak również zrobić za pomocą tych znaków specjalnych:

| Naprzemiennie, jedna lub druga
(…) Logiczne grupowanie części wyrażenia
egrep '(^root |^uucp |^Mail)' /etc /passwd

To wyodrębnia linie, które zaczynają się od korzenia, uucp lub poczty z pliku, | symbol oznacza jedną z opcji.

Następujące polecenie będzie nie praca, chociaż nie wyświetlana jest żadna wiadomość, ponieważ podstawowy Grep Polecenie nie obsługuje wszystkich wyrażeń regularnych:

grep '(^root |^uucp |^maila)' /etc /passwd

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

grep -e '(^root |^uucp |^Mail)' /etc /passwd

Za pomocą filtrów

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

Polecenia, które pojawiają się w rurociągu, są często określane jako filtry, ponieważ w wielu przypadkach przesiadają lub modyfikują dane wejściowe przed wysłaniem zmodyfikowanego strumienia na standardowe wyjście.

W poniższym przykładzie standardowe wyjście z ls -l jest przekazywany jako standardowy wejście do Grep Komenda. Wyjście z Grep Polecenie jest następnie przekazywane jako dane wejściowe do więcej Komenda.

To wyświetli tylko katalogi w /itp:

ls -l /etc | grep '^d' | więcej

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

ps -ef | grep cron
kto | grep kdm

Przykładowy plik

Aby spróbować ćwiczenia 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:

Personal J.Smith 25000
Osobisty e.Smith 25400
Szkolenie a.Brown 27500
Szkolenie c.Browen 23400
(Admin) r.Bron 30500
Towar t.Smyth 30000
Osobisty f.Jones 25000
Szkolenie* c.Evans 25500
Towar w.Papież 30400
Płaszcz t.Smythe 30500
Personal J.Maler 33000

Ćwiczenie II

  1. Wyświetl plik ludzie i sprawdź jego zawartość.
  2. Znajdź wszystkie wiersze zawierające ciąg Kowal w pliku ludzie.Wskazówka: użyj polecenia grep, ale pamiętaj, że domyślnie jest to wrażliwe.
  3. Utwórz nowy plik, npeople, zawierający wszystkie wiersze zaczynające się od ciągu Osobisty w pliku ludzi.Wskazówka: użyj polecenia grep z>.
  4. Potwierdź zawartość pliku npeople, wymieniając plik.
  5. Teraz dołącz wszystkie wiersze, w których tekst kończy się łańcuchem 500 w pliku ludzie do pliku npeople.Wskazówka: użyj polecenia grep z >>.
  6. Ponownie potwierdź zawartość pliku npeople, wymieniając plik.
  7. Znajdź adres IP serwera, który jest przechowywany w pliku /etc/hosts.Wskazówka: użyj polecenia GREP z $ (nazwa hosta)
  8. Używać Egrep wyodrębnić z /etc/passwd Linie konta pliku zawierające LP lub twój własny identyfikator użytkownika.

Rozwiązania ćwiczeń można znaleźć na końcu tego artykułu.

Więcej wyrażeń regularnych

Wyrażenie regularne można traktować jako dzikie karty na sterydach.

Istnieje jedenaście znaków ze specjalnymi znaczeniami: otwierające i zamykające kwadratowe nawiasy [], backslash \, CareT ^, znak dolara $, okres lub kropka ., Pionowy pasek lub symbol rurowy |, znak zapytania ?, gwiazdka lub gwiazda *, znak plus + oraz okrągły wspornik otwierający i zamykający . Te znaki specjalne są również często nazywane Metacharacters.

Oto pełny zestaw znaków specjalnych:

^ Początek linii
$ Koniec linii
. Każda postać (z wyjątkiem nowej linii)
* 0 lub więcej poprzedniego wyrażenia
| Naprzemiennie, jedna lub druga
[…] Wyraźny zestaw postaci do dopasowania
+ 1 lub więcej poprzednich wyrażeń
? 0 lub 1 poprzedniego wyrażenia
\ Poprzedzający symbol czyni go dosłownym postacią
Wyraźne zapis kwantyfikatorów
(…) Logiczne grupowanie części wyrażenia

Domyślna wersja Grep ma jedynie ograniczone wsparcie wyrażeń regularnych. Aby wszystkie następujące 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' myfile

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

egrep '^x (yz | yz)' myfile

Aby znaleźć linie za pomocą [] do dopasowania dowolnej postaci:

egrep '^x [yy] z' myfile

Aby znaleźć linie za pomocą [], aby nie pasować do żadnego znaku:

egrep '^x [^yy] z' myfile

Aby znaleźć linie za pomocą * do dopasowania 0 lub więcej poprzedniego wyrażenia:

egrep '^xy*z' myfile

Aby znaleźć linie za pomocą + do dopasowania 1 lub więcej poprzedniego wyrażenia:

egrep '^xy+z' myfile

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

egrep '^xy?Z 'myfile

Ćwiczenie III

  1. Znajdź wszystkie wiersze zawierające nazwy Evans Lub Maler w pliku ludzie.
  2. Znajdź wszystkie wiersze zawierające nazwy Smith, Smyth Lub Smythe w pliku ludzie.
  3. Znajdź wszystkie wiersze zawierające nazwy Brown, Browen Lub Bron w pliku ludzie.Jeśli masz czas:
  4. Znajdź linię zawierającą ciąg (Admin), w tym wsporniki, w plikach.
  5. Znajdź linię zawierającą znak * w pliku ludzie.
  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 postaci:

egrep '^xy.*Z 'myfile

Aby znaleźć linie za pomocą do dopasowania N liczby znaków:

egrep '^xy 3 z' myfile
egrep '^xy 4 z' myfile

Aby znaleźć linie za pomocą do dopasowania N lub więcej razy:

egrep '^xy 3, z' myfile

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

egrep '^xy 2,3 z' myfile

Wniosek

W tym samouczku najpierw przyjrzeliśmy się użyciu Grep w prostej formie znalezienie tekstu w pliku lub w wielu plikach. Następnie połączyliśmy tekst do wyszukiwania z prostymi wyrażeniami regularnymi, a następnie bardziej złożonymi za pomocą Egrep.

Następne kroki

Mam nadzieję, że dobrze wykorzystasz wiedzę. Spróbować Grep Polecenia na własnych danych i pamiętaj, wyrażenia regularne opisane tutaj mogą być używane w tej samej formie w vi, sed I Awk!

Rozwiązania ćwiczeń

Ćwiczenie

Najpierw policz liczbę linii w pliku /etc/passwd.

wc -l /etc /passwd

Teraz znajdź wszystkie wystąpienia tekstu var w pliku /etc /passwd.

grep var /etc /passwd

Znajdź liczbę linii w pliku zawiera tekst var

grep -c var /etc /passwd

Znajdź, ile wierszy nie zawiera tekstu var.

grep -cv var /etc /passwd

Znajdź wpis do logowania w /etc/passwd plik

grep kdm /etc /passwd


Ćwiczenie II

Wyświetl plik ludzie i sprawdź jego zawartość.

Kat

Znajdź wszystkie wiersze zawierające ciąg Kowal w pliku ludzie.

Grep „Smith” ludzie

Utwórz nowy plik, Npeople, zawierające wszystkie wiersze zaczynające się od ciągu Osobisty w ludzie plik

grep '^osobisty' ludzie> npeople

Potwierdź zawartość pliku Npeople Wymieniając plik.

Kot Npeople

Teraz dołącz wszystkie wiersze, w których tekst kończy się łańcuchem 500 w pliku ludzie do pliku Npeople.

grep '500 $' ludzi >> npeople

Ponownie potwierdź zawartość pliku Npeople Wymieniając plik.

Kot Npeople

Znajdź adres IP serwera, który jest przechowywany w pliku /etc/hosts.

grep $ (nazwa hosta) /etc /hosts

Używać Egrep wyodrębnić z /etc/passwd Linie konta pliku zawierające LP lub twój własny identyfikator użytkownika.

egrep '(lp | kdm :)' /etc /passwd


Ćwiczenie III

Znajdź wszystkie wiersze zawierające nazwy Evans Lub Maler w pliku ludzie.

Egrep „Evans | Maler” ludzie

Znajdź wszystkie wiersze zawierające nazwy Kowal, Smyth Lub Smythe w pliku ludzie.

egrep 'sm (i | y)?' ludzie

Znajdź wszystkie wiersze zawierające nazwy brązowy, Browen Lub Bron w pliku ludzie.

Egrep 'Brow?mi?n 'ludzie

Znajdź linię zawierającą ciąg (Admin), w tym wsporniki, w pliku ludzie.

$ egrep '\ (admin \)' ludzie

Znajdź linię zawierającą znak * w pliku ludzie.

egrep „\*”

Połącz 5 i 6 powyżej, aby znaleźć oba wyrażenia.

egrep '\ (admin \) | \*' ludzie