Kako koristiti Awk i regularne izraze za filtriranje teksta ili niza u datotekama


Kada izvodimo određene naredbe u Unixu/Linuxu za čitanje ili uređivanje teksta iz niza ili datoteke, najčešće pokušavamo filtrirati izlaz u određeni odjeljak koji nas zanima. Ovdje je korisna upotreba regularnih izraza.

Pročitajte također: 10 korisnih Linux operatora lančanog povezivanja s praktičnim primjerima

Što su regularni izrazi?

Regularni izraz može se definirati kao niz znakova koji predstavlja nekoliko nizova znakova. Jedna od najvažnijih stvari o regularnim izrazima je da vam omogućuju filtriranje izlaza naredbe ili datoteke, uređivanje odjeljka tekstualne ili konfiguracijske datoteke i tako dalje.

Značajke regularnog izraza

Regularni izrazi se sastoje od:

  1. Obični znakovi kao što su razmak, podvlaka (_), A-Z, a-z, 0-9.
  2. Meta znakovi koji su prošireni na obične znakove, uključuju:

    1. (.) odgovara bilo kojem pojedinačnom znaku osim novog retka.
    2. (*) podudara se s nula ili više postojanja neposrednog znaka koji mu prethodi.
    3. [ character(s) ] odgovara bilo kojem od znakova navedenih u character(s), također se može koristiti crtica (-) za označavanje niza znakova kao kao [a-f], [1-5], i tako dalje.
    4. ^ odgovara početku retka u datoteci.
    5. $ odgovara kraju retka u datoteci.
    6. \ to je izlazni znak.

Kako bi se filtrirao tekst, potrebno je koristiti alat za filtriranje teksta kao što je awk. awk možete zamisliti kao vlastiti programski jezik. Ali za opseg ovog vodiča za korištenje awk, obradit ćemo ga kao jednostavan alat za filtriranje naredbenog retka.

Opća sintaksa awk-a je:

awk 'script' filename

Gdje je 'script' skup naredbi koje razumije awk i izvršavaju se na datoteci, naziv datoteke.

Radi tako da čita zadani redak u datoteci, izrađuje kopiju retka i zatim izvršava skriptu na retku. Ovo se ponavlja u svim redovima u datoteci.

'script' je u obliku '/pattern/ action' gdje je pattern regularni izraz, a action je ono što će awk učiniti kada pronađe zadani uzorak u retku.

Kako koristiti Awk alat za filtriranje u Linuxu

U sljedećim primjerima usredotočit ćemo se na meta znakove o kojima smo raspravljali gore pod značajkama awk-a.

Jednostavan primjer korištenja awk-a:

Primjer ispod ispisuje sve retke u datoteci /etc/hosts budući da nije dan uzorak.

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

Koristite Awk s uzorkom:

U primjeru ispod, dat je uzorak localhost, tako da će awk odgovarati retku koji ima localhost u datoteci /etc/hosts.

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

Korištenje Awk-a sa (.) zamjenskim znakom u uzorku

(.) odgovarat će nizovima koji sadrže loc, localhost, localnet u donjem primjeru.

To znači * l some_single_character c *.

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

Korištenje Awk-a sa znakom (*) u uzorku

Podudarat će nizove koji sadrže localhost, localnet, lines, capable, kao u primjeru ispod:

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

Također ćete shvatiti da (*) pokušava dobiti najduže moguće podudaranje koje može otkriti.

Pogledajmo slučaj koji to pokazuje, uzmimo regularni izraz t*t koji znači podudaranje nizova koji počinju slovom t i završavaju sa t u retku ispod:

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

Dobit ćete sljedeće mogućnosti kada koristite obrazac /t*t/:

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 (*) u zamjenskom znaku /t*t/ omogućuje awk-u da izabere posljednju opciju:

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

Korištenje Awk-a sa skupom [ znakova ]

Uzmimo za primjer skup [al1], ovdje će awk odgovarati svim nizovima koji sadrže znak a ili l ili 1 u retku u datoteci /etc/hosts.

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

Sljedeći primjer odgovara nizovima koji počinju s K ili k nakon čega slijedi T:

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

Određivanje znakova u rasponu

Razumijevanje znakova s awk-om:

  1. [0-9] znači jedan broj
  2. [a-z] znači podudaranje s jednim malim slovom
  3. [A-Z] znači podudaranje s jednim velikim slovom
  4. [a-zA-Z] znači podudaranje s jednim slovom
  5. [a-zA-Z 0-9] znači podudaranje s jednim slovom ili brojem

Pogledajmo primjer u nastavku:

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

Svi redovi iz datoteke /etc/hosts sadrže barem jedan broj [0-9] u gornjem primjeru.

Koristite Awk s (^) meta znakom

Odgovara svim retcima koji počinju s uzorkom danim kao u primjeru u nastavku:

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

Koristite Awk s ($) meta znakom

Odgovara svim retcima koji završavaju navedenim uzorkom:

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

Koristite Awk s (\) znakom za izlaz

Omogućuje vam da lik koji ga slijedi shvatite kao doslovno, što znači da ga smatrate takvim kakav jest.

U donjem primjeru, prva naredba ispisuje sve retke u datoteci, druga naredba ne ispisuje ništa jer želim pronaći redak koji ima $25.00, ali se ne koristi znak izlaza.

Treća naredba je ispravna budući da je korišten znak izlaza za čitanje $ kakav jest.

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

Sažetak

To nije sve s awk alatom za filtriranje naredbenog retka, gornji primjeri prikazuju osnovne operacije awk-a. U sljedećim dijelovima ćemo govoriti o tome kako koristiti složene značajke awk-a. Hvala na čitanju i za sve dodatke ili pojašnjenja, objavite komentar u odjeljku za komentare.