Narzędzia użytkownika

Narzędzia witryny


materialy:podstawy-administracji:wyrazenia-regularne

Przeszukiwanie tekstu z wykorzystaniem wyrażeń regularnych

Standardowe symbole wieloznaczne (file globbing)

Standardowe symbole wieloznaczne, używane w większości systemów operacyjnych, pozwalają na szybki wybór wielu obiektów (najczęściej plików i katalogów) dla których wykonywane są określone operacje. Do najbardziej popularnych symboli wieloznacznych należy * (gwiazdka, ang. asterisk) oznaczający dowolny ciąg znaków lub jego brak. Wykonanie komendy ls a* powoduje wyświetlenie plików z bieżącego katalogu, których nazwa rozpoczyna się od małej litery a.

Lista najważniejszych symboli wieloznacznych:

symbol znaczenie przykład wzorca pasujące ciągi znaków niepasujące ciągi znaków
* ciąg dowolnych znaków o dowolnej długości aka* akacja akademia aka wakacje bakalie ak
? dowolny jeden znak wa?a waga waza wata wanna uwaga
[abc] dowolny znak podany w nawiasach wa[gz]a waga waza wata
[a-Z] dowolny znak z podanego zakresu w nawiasach wa[A-N]a waGa waTa waza waZa waga
[!abc] zaprzeczenie - dowolny znak z pominięciem tych za symbolem wykrzyknika wa[!zg]a wata waTa waXa waga waza

Przykłady użycia:

ls -ld /etc/a*
ls -ld /etc/a????
ls -ld /etc/[ejx]*
ls -ld /etc/[e-x]*

Dokumentacja systemu dotycząca symboli globalnych:

man 7 glob

Wyrażenia regularne

Wyrażenie regularne (ang. regular expressions) to wzorce, które opisują różne ciągi znakowe. Mają identyczne zastosowanie co standardowe symbole wieloznaczne, ale są znacznie bardziej zaawansowane i dają więcej możliwości. Popularne komendy, które mogą korzystać z wyrażeń regularnych to grep, sed i find.

Oficjalna dokumentacja dla wyrażeń regularnych:

man 7 regex

Wyrażenia regularne również używają odpowiednich symboli, aby można było opisać ciągi znaków. Część z tych symboli należy do kategorii rozszerzonych (E - ang. extended) i aby ich używać trzeba zazwyczaj w komendzie użyć dodatkowego parametru aby o tym komendę poinformować i aby były poprawnie zinterpretowane.

Symbole wyrażeń regularnych, ich znaczenia i przykłady:

Wzorzec/symbol Znaczenie
. dowolny znak
* poprzedni znak/wyrażenie może wystąpić 0 lub więcej razy
+ poprzedni znak/wyrażenie może wystąpić 1 lub więcej razy (E)
? poprzedni znak/wyrażenie może wystąpić 0 lub raz (E)
[] dowolny znak spośród tych między nawiasam
^ początek linii
$ koniec linii
\ anuluje działanie symbolu wieloznacznego po tym znaku
() grupuje symbole w zestawy (E)
{n} poprzedni znak/wyrażenie musi wystąpić n razy (E)
| rozdziela alternatywne ciągi znaków
.* dowolny ciąg znaków
a.*j. ciąg znaków, gdzie pierwszy znak to litera a, przedostatnia j
[0-9]:[0-9] dwie cyfry rozdzielone dwukropkiem
(oo)+ przynajmniej jedno wystąpienie ciągu oo (E)
(root ){2} dokładnie 2 wystąpienia ciągu root (na końcu jest spacja) (E)
[[:digit:]] cyfra
[[:blank:]] biały znak
[[:lower:]] mała liter
[[:upper:]] wielka litera

Symbole standardowe a regex (ekwiwalenty):

standardowy regex
* .*
? .
[agk] [agk]
[a-e] [a-e]

Przykłady użycia wyrażeń regularnych:

ls -l /etc | grep '.*conf'
ls -l /etc | grep -E '[[:digit:]]{4}'
ls -l /etc | grep -E '(se|mt).*conf$'
ls -l /etc | grep -F 'conf'

Komenda grep

Jedna z najpopularniejszych komend systemu linux - grep (global regular expression print) - używana najczęściej w połączeniu z innymi komendami za pomocą potoków służy do filtrowania wyświetlanego na konsoli tekstu. Dzięki komendzie można wyświetlić wybrane (wyfiltrowane) linie pliku tekstowego lub wybrane linie wyniku dowolnej komendy.

Podstawowa składnia i przykłady użycia:

grep [OPCJE] FILTR plik-tekstowy
inna-komenda | grep [OPCJE] FILTR

grep --colour tcp /etc/services
ifconfig | grep --colour inet

Komenda przyjmuje wiele parametrów, ale te decydujące o tym jak ma być interpretowany filtr to:

  • -E (extended) - pozwala na używanie symboli rozszerzonych regex, ekwiwalentem dla grep -E jest komenda egrep
  • -F (fixed) - użycie tylko prostych ciągów znaków, bez regexp czy podstawowych symboli wieloznacznych, ekwiwalentem dla grep -F jest komenda fgrep
  • bez powyższych parametrów - używa podstawowych symboli regexp

W przypadku potrzeby użycia symbolu rozszerzonego regexp należy pamiętać o dodaniu parametru -E lub użyciu komendy egrep, na przykład:

ls /etc | grep -E "is{2}ue"
ls /etc | egrep "is{2}ue"

Inne przydatne parametry:

  • -v – wyświetla te linie, dla których wzorca nie znaleziono
  • -i – zignoruje wielkość liter
  • --colour – koloruje wynik (grep wyświetla domyślnie całe linie ze znalezionym fragmentem pasującym do wzorca, ale ten fragment zostaje pokolorowany - przydatne w nauce regexp)
  • -o – pokaż tylko pasujące do wzorca ciągi znaków (zamiast całe linie zawierające te ciągi)
  • -n – wyświetl dodatkowo numer linii w wyniku
  • -R lub -r – przeszukuj rekursywnie w podkatalogach (-R zagląda również w zawartość linków symbolicznych)

Komenda sed

Komenda sed (stream editor) podobnie jak grep jest narzędziem pozwalającym filtrować wyświetlany na ekranie tekst lub zawartość pliku tekstowego. Jego główna użyteczność opiera się na funkcjonalności podmiany tekstu na inny w analizowanym tekście (substitute, search&replace). Narzędzie zostało nazwane edytorem strumieniowym gdyż pozwala wykonywać na bieżąco operacje na tekście pochodzącym z potoku.

Podstawowa składnia i przykłady użycia:

sed [OPCJE] KOMENDA-SED plik-tekstowy
inna-komenda | sed [OPCJE] KOMENDA-SED

sed -n '22,24p' /etc/services
ifconfig | sed -n "/packets/p"

Zasada działania sed polega na czytaniu linia po linii tekstu z potoku lub pliku tekstowego i dla każdej linii z osobna wykonanie określonej komendy. Komenda jest zamieszczona zazwyczaj w cudzysłowach.

Replace

Najbardziej popularną komendą jest możliwość zamiany tekstu na inny (substitute).

sed "s/root/administrator/" /etc/passwd

Powyższe spowoduje wyświetlenie w pierwszej linii: administrator:x:0:0:root:/root:/bin/bash zamiast root:x:0:0:root:/root:/bin/bash

s/root/administrator/ należy interpretować następująco - zamień pierwsze wystąpienie słowa root na słowo administrator. W pierwszy wierszu pliku /etc/passwd znajduje się kilka słów root. Aby zamienić je wszystkie należy po ostatnim znaku / dopisać opcję g (global):

sed "s/root/administrator/g" /etc/passwd

co powinno wyświetlić w pierwszej linii: administrator:x:0:0:administrator:/administrator:/bin/bash

Sed operuje na wzorcach wyrażeń regularnych. W komendzie pomiędzy pierwszym a drugim / wystarczy wpisać wzorzec wyrażenia regularnego:

sed "s/r..t/administrator/g" /etc/passwd

Aby skorzystać z rozszerzonych (extended) symboli regex należy użyć opcji -r (regexp extended).

sed -r "s/ro{2}t/administrator/g" /etc/passwd

Za pomocą operatora & można dokleić tekst przed lub po znalezionym fragmencie zdefiniowanym przez wzorzec. Przykładowo:

uname -a | sed "s/Linux/Moj&/g"

Powyższe podmieni wszystkie wystąpienia słowa „Linux” na „MojLinux” na wyjściu komendy uname -a.

Print

Jeśli chcemy wykorzystać sed podobnie do grep (wyświetl tylko linie pasujące do wzorca) należy użyć opcji -n która blokuje wyświetlanie analizowanych przez sed linii chyba, że zostanie użyta komenda p (print):

sed -n "/root/p" /etc/passwd

Powyższe wyświetla tylko te linii które zawierają słowo root. Bez -n linia ta wyświetlana byłaby dwukrotnie.

Można operować na adresach - numerach linii, które mają być wyświetlane (poniżej z zakresu od 80 do 82 włącznie):

sed -n "80,82p" /etc/services

lub na wzorcach - poniżej wyświetl linie od tej zaczynającej od słowa „ssh” do tej zaczynającej się od „time” (znak ^ w regexp oznacza początek linii):

sed -n '/^ssh/,/^time/p' /etc/services

Delete

Jeśli pewne linie mają nie być wyświetlane (ekwiwalent grep -v) można użyć komendy d (delete): Wyświetl wszystkie linie pliku /etc/services poza tymi z ciągiem znaków tcp:

sed "/tcp/d" /etc/services

Można również pomijać w wyświetlanych liniach poprzez adresowane numerycznie (a nie wyszukiwane po wzorcu):

sed "3,50d" /etc/passwd

lub w sposób mieszany:

sed "3,/^ssh/d" /etc/passwd

Polecane strony:

Kilka komend sed w jednej linii

Aby wywołać kilka komend w sed należy posiłkować się opcją -e:

sed -e "3,50d" -e "s/root/admin/g" /etc/passwd

Modyfikacja pliku inline

Komenda sed uruchomiona na pliku tekstowym w domyślnej konfiguracji nie modyfikuje go a jedynie wyświetla w formie zmodyfikowanej jego zawartość na konsoli. Aby sed zmodyfikował od razu plik na którym operuje należy użyć opcji -i. Warto zaraz po tej opcji podać nazwę rozszerzenia, które będzie nadane plikowi oryginalnemu przed jego modyfikacją. Opcja -i.bak spowoduje, że oryginał zostanie zapisany z dopisanym rozszerzeniem .bak a oryginał zmodyfikowany. Przykładowo:

echo raz dwa trzy > plik
sed -i.bak "s/dwa/2/g" plik

Powyższe w pierwszym kroku utworzy testowy plik a w kolejnym podmieni w tym pliku słowo „dwa” na „2” a oryginał zapisze w pliku o nazwie plik.bak.

Przykłady zastosowania wyrażeń regularnych w komendach sed, grep i find

Wyświetl plik blkid.conf bez linii komentarzy (# na początku linii)

sed '/^#.*/d' /etc/blkid.conf

Wyświetl tylko te linie pliku, które mają dwie wielkie litery obok siebie

sed -n -E '/[[:upper:]]{2}/p' /etc/blkid.conf

Wyświetl tylko te linie, dla których 4-tym znakiem od końca jest znak równości

grep '=...$' /etc/blkid.conf

Wyświetl tylko te linie, które zawiarają dowolny ciąg znaków poprzedzony i zakończony ukośnikiem

grep '\/.*\/' /etc/blkid.conf

Wyświetl tylko te linie, które zawierają literę n razy lub więcej obok siebie

grep -E 'n+' /etc/blkid.conf

Znajdz pliki w /etc których pełna ścieżka dostępu kończy się na conf

find /etc -regex '.*conf$'
find /etc | grep '.*conf$'

Zamień miejscami dwa wyrazy rozdzielone „białym znakiem”:

echo jeden dwa | sed "s/\(.*\)[[:blank:]]\(.*\)/\2 \1/g"

Masz potrzebę, aby powyższa strona była rozbudowana? - Napisz do nas!.

materialy/podstawy-administracji/wyrazenia-regularne.txt · ostatnio zmienione: 2015/02/05 18:50 przez mzalewski

(C) 2017 ITMZ Mariusz Zalewski