Jak używać Awk i wyrażeń regularnych do filtrowania tekstu lub ciągu znaków w plikach
Kiedy uruchamiamy określone polecenia w systemie Unix/Linux, aby odczytać lub edytować tekst z ciągu znaków lub pliku, najczęściej staramy się filtrować dane wyjściowe do danej sekcji, która nas interesuje. Tutaj z pomocą przychodzą wyrażenia regularne.
Przeczytaj także: 10 przydatnych operatorów łączenia łańcuchowego w systemie Linux z praktycznymi przykładami
Co to są wyrażenia regularne?
Wyrażenie regularne można zdefiniować jako ciąg znaków reprezentujący kilka sekwencji znaków. Jedną z najważniejszych cech wyrażeń regularnych jest to, że pozwalają one filtrować dane wyjściowe polecenia lub pliku, edytować sekcję pliku tekstowego lub konfiguracyjnego i tak dalej.
Cechy wyrażeń regularnych
Wyrażenia regularne składają się z:
- Zwykłe znaki, takie jak spacja, podkreślenie(_), A-Z, a-z, 0-9.
Metaznaki, które są rozwijane do zwykłych znaków, obejmują:
(.)
dopasowuje dowolny pojedynczy znak z wyjątkiem znaku nowej linii.
(*)
dopasowuje zero lub więcej istnień bezpośredniego znaku go poprzedzającego.[znaki ]
dopasowuje dowolny ze znaków określonych w znakach, można również użyć łącznika(-)
do oznaczenia zakresu znaków, np. jako[a-f]
,[1-5]
i tak dalej.^
dopasowuje początek linii w pliku.$
dopasowuje koniec linii w pliku.\
jest to znak ucieczki.
Aby filtrować tekst, należy użyć narzędzia do filtrowania tekstu, takiego jak awk. Możesz myśleć o awk jak o własnym języku programowania. Jednak w ramach tego przewodnika po używaniu awk omówimy go jako proste narzędzie do filtrowania z wiersza poleceń.
Ogólna składnia awk jest następująca:
awk 'script' filename
Gdzie 'skrypt'
to zestaw poleceń rozumianych przez awk i wykonywanych w pliku nazwa_pliku.
Działa poprzez odczytanie danej linii z pliku, utworzenie kopii tej linii, a następnie wykonanie skryptu na tej linii. Powtarza się to we wszystkich wierszach pliku.
'skrypt'
ma postać '/pattern/action'
gdzie wzorzec jest wyrażeniem regularnym, a akcją tak zrobi awk, gdy znajdzie podany wzorzec w linii.
Jak korzystać z narzędzia filtrującego Awk w systemie Linux
W poniższych przykładach skupimy się na metaznakach, które omówiliśmy powyżej w ramach cech awk.
Prosty przykład użycia awk:
Poniższy przykład wypisuje wszystkie linie z pliku /etc/hosts, ponieważ nie podano żadnego wzorca.
awk '//{print}'/etc/hosts
Użyj Awk ze wzorcem:
W poniższym przykładzie podano wzorzec localhost
, więc awk dopasuje linię zawierającą localhost w pliku /etc/hosts
.
awk '/localhost/{print}' /etc/hosts
Używanie Awk z (.) symbolem wieloznacznym we wzorcu
(.)
dopasuje ciągi zawierające loc, localhost, localnet w poniższym przykładzie.
To znaczy * l jakiś_single_character c *.
awk '/l.c/{print}' /etc/hosts
Używanie Awk ze znakiem (*) we wzorcu
Dopasuje ciągi zawierające localhost, localnet, linie, capable, jak w przykładzie poniżej:
awk '/l*c/{print}' /etc/localhost
Zdasz sobie również sprawę, że (*)
próbuje uzyskać najdłuższe dopasowanie, jakie może wykryć.
Spójrzmy na przypadek, który to pokazuje, weźmy wyrażenie regularne t*t
, które oznacza dopasowanie ciągów znaków zaczynających się na literę t
i kończących się na t
w poniższej linijce:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint.
Korzystając ze wzorca /t*t/
uzyskasz następujące możliwości:
this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint
A (*)
w /t*t/
znaku wieloznacznym pozwala awk wybrać ostatnią opcję:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint
Używanie Awk z zestawem [znaków]
Weźmy na przykład zestaw [al1]
, tutaj awk dopasuje wszystkie ciągi znaków zawierające znak a
lub l
lub 1
w linii w pliku /etc/hosts.
awk '/[al1]/{print}' /etc/hosts
Następny przykład dopasowuje ciągi znaków rozpoczynające się od K
lub k
, po których następuje T
:
awk '/[Kk]T/{print}' /etc/hosts
Określanie znaków w zakresie
Zrozum znaki za pomocą aw:
[0-9]
oznacza pojedynczą liczbę[a-z]
oznacza dopasowanie pojedynczej małej litery[A-Z]
oznacza dopasowanie pojedynczej dużej litery[a-zA-Z]
oznacza dopasowanie pojedynczej litery[a-zA-Z 0-9]
oznacza dopasowanie pojedynczej litery lub cyfry
Spójrzmy na przykład poniżej:
awk '/[0-9]/{print}' /etc/hosts
Cała linia z pliku /etc/hosts zawiera co najmniej jedną liczbę [0-9]
w powyższym przykładzie.
Użyj Awk ze znakiem meta (^).
Pasuje do wszystkich linii rozpoczynających się od podanego wzorca, jak w przykładzie poniżej:
awk '/^fe/{print}' /etc/hosts
awk '/^ff/{print}' /etc/hosts
Użyj Awk ze znakiem meta ($).
Pasuje do wszystkich linii kończących się podanym wzorem:
awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts
Użyj Awk ze znakiem ucieczki (\).
Pozwala przyjąć następujący znak jako dosłowny, to znaczy rozważyć go takim, jaki jest.
W poniższym przykładzie pierwsze polecenie wypisuje całą linię z pliku, drugie polecenie nie wypisuje niczego, ponieważ chcę dopasować linię, która ma 25,00 $, ale nie jest używany żaden znak ucieczki.
Trzecie polecenie jest poprawne, ponieważ do odczytania $ w obecnej postaci użyto znaku ucieczki.
awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt
Streszczenie
To nie wszystko, jeśli chodzi o narzędzie do filtrowania wiersza poleceń awk, powyższe przykłady to podstawowe operacje awk. W następnych częściach będziemy rozwijać sposób wykorzystania złożonych funkcji awk. Dziękujemy za przeczytanie i wszelkie uzupełnienia lub wyjaśnienia, opublikuj komentarz w sekcji komentarzy.