Vyhledávání na webu

Jak používat Awk a regulární výrazy k filtrování textu nebo řetězců v souborech


Když spouštíme určité příkazy v Unixu/Linuxu pro čtení nebo úpravu textu z řetězce nebo souboru, většinou se snažíme filtrovat výstup do dané sekce zájmu. Zde se hodí použití regulárních výrazů.

Čtěte také: 10 užitečných operátorů řetězení Linuxu s praktickými příklady

Co jsou regulární výrazy?

Regulární výraz lze definovat jako řetězce, které představují několik posloupností znaků. Jednou z nejdůležitějších věcí na regulárních výrazech je, že umožňují filtrovat výstup příkazu nebo souboru, upravovat část textového nebo konfiguračního souboru a tak dále.

Vlastnosti regulárního výrazu

Regulární výrazy se skládají z:

  1. Obyčejné znaky, jako je mezera, podtržítko (_), A–Z, a–z, 0–9.
  2. Meta znaky, které jsou rozšířeny na běžné znaky, zahrnují:

    1. (.) odpovídá libovolnému jednotlivému znaku kromě nového řádku.
    2. (*) odpovídá nule nebo více existenci bezprostředního znaku, který mu předchází.
    3. [ znak(y) ] odpovídá kterémukoli ze znaků uvedených ve znaku(ech), lze také použít pomlčku (-) k označení rozsahu znaků, např. jako [a-f], [1-5] a tak dále.
    4. ^ odpovídá začátku řádku v souboru.
    5. $ odpovídá konci řádku v souboru.
    6. \ je znak escape.

Chcete-li text filtrovat, musíte použít nástroj pro filtrování textu, jako je awk. awk si můžete představit jako vlastní programovací jazyk. Ale pro rozsah tohoto průvodce používáním awk jej pokryjeme jako jednoduchý nástroj pro filtrování příkazového řádku.

Obecná syntaxe awk je:

awk 'script' filename

Kde 'script' je sada příkazů, kterým rozumí awk a které se spouštějí v souboru, názvu souboru.

Funguje tak, že načte daný řádek v souboru, vytvoří kopii řádku a poté na řádku provede skript. To se opakuje na všech řádcích v souboru.

'script' je ve tvaru '/pattern/ action', kde pattern je regulární výraz a akce > je to, co awk udělá, když najde daný vzor v řádku.

Jak používat Awk Filtering Tool v Linuxu

V následujících příkladech se zaměříme na meta znaky, o kterých jsme hovořili výše v rámci funkcí awk.

Jednoduchý příklad použití awk:

Níže uvedený příklad vytiskne všechny řádky v souboru /etc/hosts, protože není zadán žádný vzor.

awk '//{print}'/etc/hosts

Použít Awk se vzorem:

V níže uvedeném příkladu byl zadán vzor localhost, takže awk bude odpovídat řádku s localhost v souboru /etc/hosts.

awk '/localhost/{print}' /etc/hosts 

Použití Awk se zástupným znakem (.) ve vzoru

(.) bude odpovídat řetězcům obsahujícím loc, localhost, localnet v příkladu níže.

To znamená * l some_single_character c *.

awk '/l.c/{print}' /etc/hosts

Použití Awk se znakem (*) ve vzoru

Bude odpovídat řetězcům obsahujícím localhost, localnet, lines, capable, jako v příkladu níže:

awk '/l*c/{print}' /etc/localhost

Také si uvědomíte, že (*) se vám snaží získat nejdelší možnou shodu, kterou dokáže detekovat.

Podívejme se na případ, který to demonstruje, vezměte si regulární výraz t*t, což znamená shodu řetězců začínajících písmenem t a končících t v řádku níže:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint. 

Při použití vzoru /t*t/ získáte následující možnosti:

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 (*) v /t*t/ zástupný znak umožňuje awk vybrat poslední možnost:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint

Použití Awk se sadou [ znaků ]

Vezměte si například sadu [al1], zde awk bude odpovídat všem řetězcům obsahujícím znak a nebo l nebo 1 na řádku v souboru /etc/hosts.

awk '/[al1]/{print}' /etc/hosts

Následující příklad odpovídá řetězcům začínajícím buď K nebo k následovaným T:

awk '/[Kk]T/{print}' /etc/hosts 

Určení znaků v rozsahu

Pochopte znaky pomocí awk:

  1. [0-9] znamená jedno číslo
  2. [a-z] znamená shodu s jedním malým písmenem
  3. [A-Z] znamená shodu s jedním velkým písmenem
  4. [a-zA-Z] znamená shodu s jedním písmenem
  5. [a-zA-Z 0-9] znamená shodu s jedním písmenem nebo číslem

Podívejme se na příklad níže:

awk '/[0-9]/{print}' /etc/hosts 

Všechny řádky ze souboru /etc/hosts obsahují ve výše uvedeném příkladu alespoň jedno číslo [0-9].

Použijte Awk s (^) Meta Character

Odpovídá všem řádkům, které začínají vzorem uvedeným v níže uvedeném příkladu:

awk '/^fe/{print}' /etc/hosts
awk '/^ff/{print}' /etc/hosts

Použijte Awk s metaznakem ($).

Odpovídá všem řádkům, které končí zadaným vzorem:

awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts

Použijte Awk se znakem (\) Escape

Umožňuje vám vzít postavu, která ji následuje, doslovně, to znamená považovat ji za takovou, jaká je.

V níže uvedeném příkladu první příkaz vytiskne všechny řádky v souboru, druhý příkaz nevytiskne nic, protože chci odpovídat řádku, který má 25,00 $, ale není použit žádný znak escape.

Třetí příkaz je správný, protože ke čtení $ tak, jak je, byl použit znak escape.

awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt

souhrn

To není vše s nástrojem pro filtrování příkazového řádku awk, výše uvedené příklady a základní operace awk. V dalších dílech pokročíme v tom, jak používat komplexní funkce awk. Děkujeme za přečtení a za jakékoli doplnění nebo vysvětlení napište komentář do sekce komentářů.