Awk- ja säännöllisten lausekkeiden käyttäminen tekstin tai merkkijonon suodattamiseen tiedostoissa


Kun suoritamme tiettyjä komentoja Unixissa/Linuxissa tekstin lukemiseksi tai muokkaamiseksi merkkijonosta tai tiedostosta, yritämme useimmiten suodattaa tulosteen tiettyyn kiinnostavaan osaan. Tässä kohtaa säännöllisten lausekkeiden käyttö on kätevää.

Lue myös: 10 hyödyllistä Linuxin ketjutusoperaattoria käytännön esimerkkeineen

Mitä ovat säännölliset lausekkeet?

Säännöllinen lauseke voidaan määritellä merkkijonoksi, joka edustaa useita merkkijonoja. Yksi tärkeimmistä asioista säännöllisissä lausekkeissa on, että niiden avulla voit suodattaa komennon tai tiedoston tulosteen, muokata teksti- tai asetustiedoston osaa ja niin edelleen.

Säännöllisen lausekkeen ominaisuudet

Säännölliset lausekkeet koostuvat seuraavista:

  1. Tavalliset merkit, kuten välilyönti, alaviiva(_), A-Z, a-z, 0-9.
  2. Metahahmot, jotka on laajennettu tavallisiksi hahmoiksi. Niihin kuuluvat:

    1. (.) se vastaa mitä tahansa yksittäistä merkkiä rivinvaihtoa lukuun ottamatta.
    2. (*) se vastaa nollaa tai useampaa sitä edeltävän merkin olemassaoloa.
    3. [ merkki(t) ] se vastaa mitä tahansa merkissä määritellyistä merkeistä, voidaan myös käyttää yhdysviivaa (-) tarkoittamaan merkkialuetta, kuten kuten [a-f], [1-5] ja niin edelleen.
    4. ^ se vastaa tiedoston rivin alkua.
    5. $ vastaa tiedoston rivin loppua.
    6. \ se on pakomerkki.

Tekstin suodattamiseksi on käytettävä tekstinsuodatustyökalua, kuten awk. Voit ajatella awka omana ohjelmointikielenä. Mutta tämän awk-käyttöoppaan laajuudessa käsittelemme sitä yksinkertaisena komentorivin suodatustyökaluna.

Awk:n yleinen syntaksi on:

awk 'script' filename

Missä 'script' on joukko komentoja, jotka awk ymmärtää ja jotka suoritetaan tiedostossa, tiedostonimessä.

Se toimii lukemalla tietyn rivin tiedostossa, tekee rivistä kopion ja suorittaa sitten komentosarjan rivillä. Tämä toistetaan kaikilla tiedoston riveillä.

'script' on muodossa '/pattern/ action', jossa pattern on säännöllinen lauseke ja toiminto > on mitä awk tekee, kun se löytää annetun kuvion riviltä.

Awk-suodatustyökalun käyttäminen Linuxissa

Seuraavissa esimerkeissä keskitymme metamerkkeihin, joista keskustelimme edellä awk:n ominaisuuksien alla.

Yksinkertainen esimerkki awk:n käytöstä:

Alla oleva esimerkki tulostaa kaikki tiedoston /etc/hosts rivit, koska kuviota ei anneta.

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

Käytä awkia kuvion kanssa:

Alla olevassa esimerkissä on annettu malli localhost, joten awk vastaa riviä, jolla on localhost /etc/hosts-tiedostossa.

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

Awk:n käyttäminen jokerikortin (.) kanssa kuviossa

(.) vastaa alla olevassa esimerkissä merkkijonoja, jotka sisältävät loc, localhost ja localnet.

Eli * l some_single_character c *.

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

Awkin käyttäminen kuviossa (*)-merkin kanssa

Se vastaa merkkijonoja, jotka sisältävät localhost, localnet, lines, capable, kuten alla olevassa esimerkissä:

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

Ymmärrät myös, että (*) yrittää löytää sinulle pisimmän mahdollisen vastaavuuden, jonka se voi havaita.

Katsotaanpa tapausta, joka osoittaa tämän. Otetaan säännöllinen lauseke t*t, joka tarkoittaa hakumerkkijonoja, jotka alkavat kirjaimella t ja päättyvät t alla olevalla rivillä:

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

Saat seuraavat mahdollisuudet, kun käytät kaavaa /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

Ja (*) jokerimerkissä /t*t/ sallii awk:n valita viimeisen vaihtoehdon:

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

Awkin käyttäminen joukon [ merkki(t) ] kanssa

Otetaan esimerkiksi joukko [al1], tässä awk vastaa kaikkia merkkijonoja, jotka sisältävät merkin a tai l tai 1 tiedoston /etc/hosts rivillä.

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

Seuraava esimerkki vastaa merkkijonoja, jotka alkavat kirjaimella K tai k, jota seuraa T:

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

Merkkien määrittäminen alueella

Ymmärrä merkkejä awk:lla:

  1. [0-9] tarkoittaa yhtä numeroa
  2. [a-z] tarkoittaa, että vastaa yhtä pientä kirjainta
  3. [A-Z] tarkoittaa, että vastaa yhtä isoa kirjainta
  4. [a-zA-Z] tarkoittaa yhtä kirjainta
  5. [a-zA-Z 0-9] tarkoittaa yhtä kirjainta tai numeroa

Katsotaanpa esimerkkiä alla:

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

Kaikki tiedoston /etc/hosts rivit sisältävät vähintään yhden numeron [0-9] yllä olevassa esimerkissä.

Käytä Awkia (^) metamerkin kanssa

Se vastaa kaikkia rivejä, jotka alkavat alla olevan esimerkin mukaisella kuviolla:

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

Käytä Awkia ($) metamerkin kanssa

Se vastaa kaikkia rivejä, jotka päättyvät annettuun kuvioon:

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

Käytä Awk-näppäintä ja (\) Esc-merkkiä

Sen avulla voit ottaa sitä seuraavan hahmon kirjaimellisena eli pitää sitä sellaisena kuin se on.

Alla olevassa esimerkissä ensimmäinen komento tulostaa tiedoston kaikki rivit, toinen komento ei tulosta mitään, koska haluan täsmäyttää rivin, jossa on $25,00, mutta jossa ei käytetä estomerkkiä.

Kolmas komento on oikea, koska koodin $ lukemiseen on käytetty estomerkkiä sellaisenaan.

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

Yhteenveto

Tässä ei vielä kaikki awk-komentorivisuodatustyökalussa, yllä olevissa esimerkeissä awk:n perustoiminnot. Seuraavissa osissa jatkamme awkin monimutkaisten ominaisuuksien käyttöä. Kiitos, että luit läpi ja lisäykset tai selvennykset, lähetä kommentti kommenttiosiossa.