Kako uporabiti Awk in regularne izraze za filtriranje besedila ali niza v datotekah


Ko v Unixu/Linuxu zaženemo določene ukaze za branje ali urejanje besedila iz niza ali datoteke, največkrat poskušamo filtrirati izhod v dani odsek, ki nas zanima. Tu je uporaba regularnih izrazov zelo uporabna.

Regularni izraz lahko definiramo kot nize, ki predstavljajo več zaporedja znakov. Ena najpomembnejših stvari pri regularnih izrazih je ta, da vam omogočajo filtriranje izhoda ukaza ali datoteke, urejanje odseka besedila ali konfiguracijske datoteke itd.

Regularni izrazi so:

  1. Navadni znaki, kot so presledek, podčrtaj (_), A-Z, a-z, 0-9.
  2. Metaznaki, ki so razširjeni na običajne znake, vključujejo:
    1. (.) se ujema s katerim koli znakom, razen z novo vrstico.
    2. (*) se ujema z nič ali več obstoji neposrednega znaka pred njim.
    3. [znak (-i)] se ujema s katerim koli znakom, navedenim v znaku (-i), lahko tudi vezaj (-) pomeni obseg znakov, kot so [af] , [1-5] itd.
    4. ^ se ujema z začetkom vrstice v datoteki.
    5. $ se ujema s koncem vrstice v datoteki.
    6. \ je ubežni znak.

    Za filtriranje besedila je treba uporabiti orodje za filtriranje besedila, kot je awk. Awk si lahko predstavljate kot svoj programski jezik. Toda za področje uporabe tega priročnika za uporabo awk ga bomo obravnavali kot preprosto orodje za filtriranje ukazne vrstice.

    Splošna sintaksa awk je:

    # awk 'script' filename
    

    Kjer je script nabor ukazov, ki jih awk razume in se izvajajo v datoteki, ime datoteke.

    Deluje tako, da v datoteki prebere določeno vrstico, naredi kopijo vrstice in nato izvede skript v vrstici. To se ponovi v vseh vrsticah v datoteki.

    skripta je v obliki /pattern/action , kjer je vzorec regularni izraz, dejanje pa je tisto, kar bo awk naredil, ko bo v vrstici našel dani vzorec.

    Kako uporabljati orodje za filtriranje Awk v Linuxu

    V naslednjih primerih se bomo osredotočili na metaznake, ki smo jih obravnavali zgoraj pod značilnostmi awk.

    Spodnji primer natisne vse vrstice v datoteki/etc/hosts, ker ni podan noben vzorec.

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

    V spodnjem primeru je podan vzorec localhost , zato se bo awk ujemal z vrstico localhost v datoteki /etc/hosts .

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

    (.) se bo v spodnjem primeru ujemal z nizi, ki vsebujejo loc, localhost, localnet.

    Se pravi * l nekaj_značnih_znakov c *.

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

    Ujemala se bo z nizi, ki vsebujejo localhost, localnet, vrstice, kot v spodnjem primeru:

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

    Ugotovili boste tudi, da vam (*) poskuša zagotoviti čim daljše ujemanje, ki ga lahko zazna.

    Oglejmo si primer, ki to dokazuje, vzemite regularni izraz t * t , kar pomeni ujemanje nizov, ki se začnejo s črko t in končajo z t v spodnji vrstici:

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

    Ko uporabite vzorec /t * t/, boste dobili naslednje 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
    

    In (*) v /t * t/ znak nadomestnega znaka omogoča awk, da izbere zadnjo možnost:

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

    Vzemimo za primer niz [al1] , tukaj se bo awk ujemal z vsemi nizi, ki vsebujejo znak a ali l ali 1 v vrstici v datoteki/etc/hosts.

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

    Naslednji primer se ujema z nizi, ki se začnejo z K ali k , čemur sledi T :

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

    Razumevanje znakov z awk:

    1. [0-9] pomeni eno številko
    2. [a-z] pomeni ujemanje z eno samo malo črko
    3. [A-Z] pomeni ujemanje z eno samo veliko črko
    4. [a-zA-Z] pomeni ujemanje z eno črko
    5. [a-zA-Z 0-9] pomeni ujemanje ene črke ali številke

    Oglejmo si spodnji primer:

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

    Vsa vrstica iz datoteke/etc/hosts vsebuje vsaj eno številko [0-9] v zgornjem primeru.

    Ujema se z vsemi vrsticami, ki se začnejo z vzorcem, navedenim v spodnjem primeru:

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

    Ujema se z vsemi vrsticami, ki se končajo z navedenim vzorcem:

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

    Omogoča vam, da lik, ki mu sledi, jemljete kot dobesedno, kar pomeni, da ga upoštevajte takšnega, kot je.

    V spodnjem primeru prvi ukaz natisne vse vrstice v datoteki, drugi ukaz pa nič, ker se želim ujemati z vrstico, ki ima 25,00 USD, vendar ni uporabljen noben ubežni znak.

    Tretji ukaz je pravilen, ker je bil uporabljen ubežni znak za branje $kot je.

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

    Povzetek

    To še ni vse z orodjem za filtriranje ukazne vrstice awk, primeri zgoraj so osnovne operacije awka. V naslednjih delih bomo napredovali, kako uporabiti zapletene lastnosti awka. Hvala, ker ste prebrali in dodali ali pojasnili, objavite komentar v oddelku za komentarje.