Wyszukiwanie w witrynie

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:

  1. Zwykłe znaki, takie jak spacja, podkreślenie(_), A-Z, a-z, 0-9.
  2. Metaznaki, które są rozwijane do zwykłych znaków, obejmują:

    1. (.) dopasowuje dowolny pojedynczy znak z wyjątkiem znaku nowej linii.
    2. (*) dopasowuje zero lub więcej istnień bezpośredniego znaku go poprzedzającego.
    3. [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.
    4. ^ dopasowuje początek linii w pliku.
    5. $ dopasowuje koniec linii w pliku.
    6. \ 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:

  1. [0-9] oznacza pojedynczą liczbę
  2. [a-z] oznacza dopasowanie pojedynczej małej litery
  3. [A-Z] oznacza dopasowanie pojedynczej dużej litery
  4. [a-zA-Z] oznacza dopasowanie pojedynczej litery
  5. [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.