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 plikKorzystanie 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 pliklub
$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
- Najpierw policz ile linii znajduje się w pliku /etc/passwd.
- Teraz znajdź wszystkie wystąpienia tekstu gdzie w pliku /etc/passwd .
- Sprawdź, ile wierszy w pliku zawiera tekst
- Sprawdź, ile wierszy NIE zawiera tekstu gdzie .
- 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 plikAby znaleźć wszystkie wiersze kończące się tekstem za pomocą znaku $:
$chwyt„xyz$” mój plikAby znaleźć wiersze zawierające ciąg znaków, używając zarówno znaków ^, jak i $:
$chwyt‘^xyz$’ mój plikAby znaleźć linie za pomocą . aby dopasować dowolny znak:
$chwyt‘^x.z’ mójplikAby znaleźć wiersze za pomocą *, aby dopasować 0 lub więcej poprzedniego wyrażenia:
$chwyt‘^xy*z 'mój plikAby znaleźć wiersze za pomocą .*, aby dopasować 0 lub więcej dowolnego znaku:
$chwyt„^ X.*z 'mój plikAby znaleźć linie za pomocą aby uciec od znaku *:
$chwyt„^ X *z 'mój plikAby znaleźć znak , użyj:
$chwyt'\' mój plikWyraż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 |
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łoJednak w większości systemów Linux polecenie grep -E to to samo, co używanie egrep :
$chwyt -ORAZ '(^root|^uucp|^poczta)' /itp/hasłoKorzystanie 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”|jeszczePoniższe polecenia są przykładami użycia filtrów:
$ps -ef|chwytcron $który|chwytkdmPrzykł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 25000Osobisty 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
- Wyświetl plik ludzie i zbadaj jego zawartość.
- 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.
- 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 >.
- Potwierdź zawartość pliku npeople, wyświetlając plik.
- 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 >>.
- Ponownie potwierdź zawartość pliku npeople, wyświetlając plik.
- Znajdź adres IP serwera, który jest przechowywany w pliku /etc/hosty .Podpowiedź: użyj polecenia grep z $(nazwa hosta)
- 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 plikAby znaleźć linie za pomocą | aby dopasować dowolne wyrażenie w ciągu, użyj również ( ):
$egrep‘^ X(Yz|yz)' mój plikAby znaleźć wiersze za pomocą [ ], aby dopasować dowolny znak:
$egrep‘^ X[Yy]z 'mój plikAby znaleźć wiersze za pomocą [ ], aby NIE dopasować żadnego znaku:
$egrep‘^ X[^ Yy]z 'mój plikAby znaleźć wiersze za pomocą *, aby dopasować 0 lub więcej poprzedniego wyrażenia:
$egrep‘^xy*z 'mój plikAby znaleźć wiersze za pomocą +, aby dopasować 1 lub więcej poprzedniego wyrażenia:
$egrep‘^xy+z’ mój plikAby znaleźć wiersze za pomocą ? aby dopasować 0 lub 1 poprzedniego wyrażenia:
$egrep‘^xy?z’ mójplikĆwiczenie III
- Znajdź wszystkie wiersze zawierające nazwiska Evans lub malarz w aktach osób.
- Znajdź wszystkie wiersze zawierające nazwiska Smith, Smyth lub Smythe w aktach osób.
- Znajdź wszystkie wiersze zawierające nazwiska Brązowy, Brązowy lub Źródło w pliku osób. Jeśli masz czas:
- Znajdź linię zawierającą ciąg (Administrator), w tym nawiasy, w teczce osób.
- Znajdź wiersz zawierający znak * w pliku people.
- 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 plikAby 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 plikAby znaleźć linie za pomocą { }, aby dopasować N razy, ale nie więcej niż M razy:
$egrep‘^xy{2,3}z 'mój plikWniosek
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
Sprawdź, ile wierszy NIE zawiera tekstu gdzie .
chwyt -cvgdzie/itp/hasłoZnajdź 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 .
Znajdź linię zawierającą znak * w aktach osób.
$ egrep '*' people
Połącz 5 i 6 powyżej, aby znaleźć oba wyrażenia.