3.2 Lekcja 2
Certifikat: |
Linux Essentials |
---|---|
Wersja: |
1.6 |
Temat: |
3 Siła wiersza poleceń |
Cel nauki: |
3.2 Wyszukiwanie i wyodrębnianie danych z plików |
Lekcja: |
2 z 2 |
Wstęp
W tej lekcji przyjrzymy się narzędziom używanym do wyszukiwania danych tekstowych. Narzędzia te są często używane przez administratorów systemu lub programy do automatycznego sprawdzania lub identyfikowania określonych powtarzających się informacji.
Wyszukiwanie w plikach za pomocą polecenia grep
Pierwszym narzędziem, które omówimy w tej lekcji, jest polecenie grep
. Nazwa grep
jest skrótem od “global regular expression print”, a jego główną funkcją jest wyszukiwanie tekstu w plikach pod kątem określonego wzorca. Polecenie wyświetla wiersz zawierający określony wzorzec (często podświetlony na czerwono).
$ grep bash /etc/passwd root:x:0:0:root:/root:/bin/bash user:x:1001:1001:User,,,,:/home/user:/bin/bash
Podobnie jak większość poleceń, grep
można stosować z różnymi opcjami. Oto najpopularniejsze z nich:
-i
-
podczas wyszukiwania nie jest rozróżniana wielkość liter,
-r
-
wyszukiwanie jest rekurencyjne (przeszukuje wszystkie pliki w określonym katalogu i jego podkatalogach),
-c
-
wyszukiwanie liczy liczbę dopasowań,
-v
-
wyszukiwanie odwraca dopasowanie i zwraca wiersze, które nie pasują do wyszukiwanego terminu.,
-E
-
wyszukiwanie włącza rozszerzone wyrażenia regularne (wymagane przez niektóre bardziej zaawansowane meta-znaki, takie jak
|
,+
oraz?
).
Polecenie grep
ma również wiele innych przydatnych opcji. Zajrzyj na stronę podręcznika, aby dowiedzieć się więcej na ten temat.
Wyrażenia regularne
Kolejne narzędzie ma ogromne możliwości i służy do opisywania fragmentów tekstu w plikach, zwanych także wyrażeniami regularnymi. Wyrażenia regularne są niezwykle przydatne podczas wyodrębniania danych z plików tekstowych poprzez określanie wzorców. Są często używane w skryptach lub podczas programowania w językach wyższego poziomu, takich jak Perl lub Python.
Podczas pracy z wyrażeniami regularnymi bardzo ważne jest, aby pamiętać, że ważny jest każdy znak, a wzorzec jest napisany w celu dopasowania określonej sekwencji znaków, zwanej ciągiem znaków. Większość wzorców używa zwykłych znaków ASCII, takich jak litery, cyfry, znaki interpunkcyjne lub inne symbole. Jednakże wzorce mogą również używać znaków Unicode w celu dopasowania dowolnego innego typu tekstu.
Poniższa lista zawiera opis metaznaków wyrażeń regularnych, które są używane do tworzenia wzorca:
.
-
Dopasuj dowolny pojedynczy znak (z wyjątkiem znaku nowej linii)
[abcABC]
-
Dopasuj dowolny znak w nawiasach
[^abcABC]
-
Dopasuj dowolny znak oprócz znaków w nawiasach
[a-z]
-
Dopasuj dowolny znak z określonego zakresu znaków
[^a-z]
-
Dopasuj dowolny znak z wyjątkiem znaków z określonego zakresu
sun|moon
-
Znajdź jeden z wymienionych ciągów
^
-
Początek wiersza
$
-
Koniec wiersza
Wszystkie funkcjonalności wyrażeń regularnych można również zaimplementować za pomocą polecenia grep
. Jak widać w powyższym przykładzie, słowo nie jest ujęte w podwójne cudzysłowy. Aby zapobiec interpretacji samego meta-znaku przez powłokę zaleca się, aby bardziej złożony wzorzec znajdował się pomiędzy podwójnymi cudzysłowami (" "). Dla celów praktycznych będziemy używać podwójnych cudzysłowów podczas implementowania wyrażeń regularnych. Pozostałe cudzysłowy zachowują swoją normalną funkcjonalność, jak to wyjaśniono w poprzednich lekcjach.
Poniższe przykłady pokazują funkcjonalność wyrażeń regularnych. Będziemy potrzebować danych w pliku, dlatego następny zestaw poleceń po prostu dodaje różne ciągi do pliku text.txt
.
$ echo "aaabbb1" > text.txt $ echo "abab2" >> text.txt $ echo "noone2" >> text.txt $ echo "class1" >> text.txt $ echo "alien2" >> text.txt $ cat text.txt aaabbb1 abab2 noone2 class1 alien2
Pierwszy przykład to połączenie wyszukiwania pliku z wyrażeniami regularnymi lub bez nich. Aby w pełni zrozumieć wyrażenia regularne, bardzo ważne jest poznanie różnicy pomiędzy nimi. Pierwsze polecenie wyszukuje dokładny ciąg znaków w dowolnym miejscu w wierszu, natomiast drugie polecenie wyszukuje ciągi znaków zawierające dowolny ze znaków, które są umieszczone w nawiasach kwadratowych. Dlatego wyniki poleceń są różne.
$ grep "ab" text.txt aaabbb1 abab2 $ grep "[ab]" text.txt aaabbb1 abab2 class1 alien2
Kolejne przykłady pokazują zastosowanie meta-znaków na początku i na końcu linii. Bardzo ważne jest, aby oba znaki zostały umieszczone we właściwych miejscach w wyrażeniu. Podczas określania początku wiersza meta-znak musi znajdować się przed wyrażeniem, natomiast podczas określania końca wiersza meta-znak musi występować po wyrażeniu.
$ grep "^a" text.txt aaabbb1 abab2 alien2 $ grep "2$" text.txt abab2 noone2 alien2
Oprócz meta-znaków opisanych powyżej, wyrażenia regularne mają również inne metaznaki, które umożliwiają powtarzanie wcześniej określonego wzorca:
*
-
Zero lub więcej wystąpień poprzedniego wzorca
+
-
Jedno lub więcej wystąpień poprzedniego wzorca
?
-
Zero lub jedno wystąpienie poprzedniego wzorca
Jako przykład wielu meta-znaków, poniższe polecenie wyszukuje ciąg znaków zawierający ab
, pojedynczy znak i jeden lub więcej znaków znalezionych wcześniej. Wynik pokazuje, że polecenie grep
znalazło ciąg znaków aaabbb1
, który pasuje zarówno do części abbb
, jak i do abab2
. Ponieważ znak +
jest rozszerzonym znakiem wyrażenia regularnego, musimy polecenie grep
zastosować z opcją -E
.
$ grep -E "ab.+" text.txt aaabbb1 abab2
Większość meta-znaków jest oczywistych i nie wymaga objaśnień, ale ich pierwsze użycie może sprawiać trudność. Poprzednie przykłady pokazują niewielką część funkcjonalności wyrażeń regularnych. Wypróbuj każdy z powyższych meta-znaków, aby dowiedzieć się więcej o ich działaniu.
Ćwiczenia z przewodnikiem
Używając grep
oraz pliku /usr/share/hunspell/en_US.dic
, znajdź wiersze spełniające następujące kryteria:
. Wszystkie wiersze zawierające słowo cat
w dowolnym miejscu w wierszu.
+
-
Wszystkie wiersze, które nie zawierają żadnego z następujących znaków:
sawgtfixk
. -
Wszystkie wiersze zaczynające się od 3 dowolnych liter i słowa
dig
. -
Wszystkie wiersze kończące się co najmniej jedną literą
e
. -
Wszystkie wiersze zawierające jeden z następujących ciągów znaków:
org
,kay
lubtuna
. -
Liczbę wierszy zaczynających się od litery
c
lub nie, po których następuje ciąg znakówati
.
Ćwiczenia eksploracyjne
-
Znajdź wyrażenie regularne, które pasuje do słów w wierszu “Include” (“Zawierają”) i nie pasuje do słów w wierszu “Exclude” (“Wyklucz”):
-
Zawierają:
pot
,spot
,apot
Wykluczają:
potic
,spots
,potatoe
-
Zawierają:
arp99
,apple
,zipper
Wykluczają:
zoo
,arive
,attack
-
Zawierają:
arcane
,capper
,zoology
Wykluczają:
air
,coper
,zoloc
-
Zawierają:
0th/pt
,3th/tc
,9th/pt
Wykluczają:
0/nm
,3/nm
,9/nm
-
Zawierają:
Hawaii
,Dario
,Ramiro
Wykluczają:
hawaii
,Ian
,Alice
-
-
Jakie inne przydatne polecenie jest często używane do wyszukiwania w plikach? Jakie ma dodatkowe funkcje?
-
Weź przykład z poprzedniej lekcji, skorzystaj z jednego z przykładów i spróbuj znaleźć określony wzorzec w danych wyjściowych polecenia, korzystając z polecenia
grep
.
Podsumowanie
W tym laboratorium nauczyłeś się:
-
Rozróżniać wyrażenia regularne i metaznaki.
-
Jak tworzyć wzorce za pomocą wyrażeń regularnych
-
Jak wyszukiwać w plikach
Komendy wykorzystywane w ćwiczeniach:
grep
-
Wyszukuje znaki lub ciągi znaków w pliku
Odpowiedzi do ćwiczeń z przewodnikiem
Używając grep
oraz pliku /usr/share/hunspell/en_US.dic
, znajdź wiersze spełniające następujące kryteria:
. Wszystkie wiersze zawierające słowo cat
w dowolnym miejscu w wierszu.
+
$ grep "cat" /usr/share/hunspell/en_US.dic Alcatraz/M Decatur/M Hecate/M ...
-
Wszystkie wiersze, które nie zawierają żadnego z następujących znaków:
sawgtfixk
.$ grep -v "[sawgtfixk]" /usr/share/hunspell/en_US.dic 49269 0/nm 1/n1 2/nm 2nd/p 3/nm 3rd/p 4/nm 5/nm 6/nm 7/nm 8/nm ...
-
Wszystkie wiersze zaczynające się od 3 dowolnych liter i słowa
dig
.$ grep "^...dig" /usr/share/hunspell/en_US.dic cardigan/SM condign predigest/GDS ...
-
Wszystkie wiersze kończące się co najmniej jedną literą
e
.$ grep -E "e+$" /usr/share/hunspell/en_US.dic Anglicize Anglophobe Anthropocene ...
-
Wszystkie wiersze zawierające jeden z następujących ciągów znaków:
org
,kay
lubtuna
.$ grep -E "org|kay|tuna" /usr/share/hunspell/en_US.dic Borg/SM George/MS Tokay/M fortunate/UY ...
-
Liczbę wierszy zaczynających się od litery
c
lub nie, po których następuje ciąg znakówati
.$ grep -cE "^c?ati" /usr/share/hunspell/en_US.dic 3
Odpowiedzi do ćwiczeń eksploracyjnych
-
Znajdź wyrażenie regularne, które pasuje do słów w wierszu “Include” (“Zawierają”) i nie pasuje do słów w wierszu “Exclude” (“Wyklucz”):
-
Zawierają:
pot
,spot
,apot
Wykluczają:
potic
,spots
,potatoe
Rozwiązanie:
pot$
-
Zawierają:
arp99
,apple
,zipper
Wykluczają:
zoo
,arive
,attack
Rozwiązanie:
p+
-
Zawierają:
arcane
,capper
,zoology
Wykluczają:
air
,coper
,zoloc
Rozwiązanie:
arc|cap|zoo
-
Zawierają:
0th/pt
,3th/tc
,9th/pt
Wykluczają:
0/nm
,3/nm
,9/nm
Rozwiązanie:
[0-9]th.+
-
Zawierają:
Hawaii
,Dario
,Ramiro
Wykluczają:
hawaii
,Ian
,Alice
Rozwiązanie:
^[A-Z]a.*i+
-
-
Jakie inne przydatne polecenie jest często używane do wyszukiwania w plikach? Jakie ma dodatkowe funkcje?
Jest to polecenie
sed
. Potrafi ono znaleźć i zamienić znaki lub ciągi znaków w pliku. -
Weź przykład z poprzedniej lekcji, skorzystaj z jednego z przykładów i spróbuj znaleźć określony wzorzec w danych wyjściowych polecenia, korzystając z polecenia
grep
.Została wybrana jedna z odpowiedzi z ćwiczeń eksploracyjnych, a nastepnie szukano wiersza, który ma uprawnienia do odczytu, zapisu i wykonywania, zgodnie z uprawnieniami grupy. Twoja odpowiedź może być inna, w zależności od wybranego polecenia i utworzonego wzoru.
$ cat contents.txt | tr -s " " | grep "^....rwx"
Celem tego ćwiczenia było pokazanie, że polecenie
grep
może również otrzymywać dane wejściowe z różnych poleceń i może pomóc w filtrowaniu wygenerowanych informacji.