Kuinka käyttää Awk- ja säännöllisiä lausekkeita tekstin tai merkkijonon suodattamiseen tiedostoissa


Kun suoritamme tiettyjä komentoja Unixissa/Linuxissa lukemaan tai muokkaamaan tekstiä merkkijonosta tai tiedostosta, yritämme useimmiten suodattaa tuotoksen tiettyyn kiinnostavaan osaan. Tällöin säännöllisten lausekkeiden käyttö on kätevää.

Säännöllinen lauseke voidaan määritellä merkkijonoiksi, jotka edustavat useita merkkijonoja. Yksi säännöllisten lausekkeiden tärkeimmistä asioista on, että niiden avulla voit suodattaa komennon tai tiedoston lähdön, muokata teksti- tai määritystiedoston osaa ja niin edelleen.

Säännölliset lausekkeet ovat:

  1. Tavalliset merkit, kuten välilyönti, alaviiva (_), A-Z, a-z, 0-9.
  2. Sisällönkuvahahmot, jotka on laajennettu tavallisiin merkkeihin, sisältävät:
    1. (.) se vastaa mitä tahansa yksittäistä merkkiä paitsi uuden rivin.
    2. (*) se vastaa nollaa tai useampaa sitä edeltävän välittömän merkin olemassaoloa.
    3. [merkki (t)] se vastaa mitä tahansa merkissä määritetyistä merkeistä, voi myös käyttää väliviivaa (-) merkkejä, kuten [af] , [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ä tekstin suodatustyökalua, kuten awk. Voit ajatella awk: tä omana ohjelmointikielenä. Mutta tämän oppaan soveltamisalaan liittyen awk: n käyttämiseen, käsittelemme sen yksinkertaisena komentorivin suodatustyökaluna.

    Awk: n yleinen syntaksia on:

    # awk 'script' filename
    

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

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

    -skripti on muodossa /pattern/action , jossa kuvio on säännöllinen lauseke ja toiminto on se, mitä awk tekee, kun se löytää annetun mallin riviltä.

    Kuinka käyttää Awk-suodatustyökalua Linuxissa

    Seuraavissa esimerkeissä keskitymme metahahmoihin, joista keskustelimme yllä awk: n ominaisuuksien alla.

    Alla oleva esimerkki tulostaa kaikki tiedoston/etc/hosts rivit, koska mallia ei ole annettu.

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

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

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

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

    Toisin sanoen * l jotkut_yhden_merkin c *.

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

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

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

    Ymmärrät myös, että (*) yrittää saada sinulle mahdollisimman pitkän vastaavuuden.

    Katsotaanpa tapausta, joka osoittaa tämän, ota säännöllinen lauseke t * t , mikä tarkoittaa vastaavuusmerkkijonoja, 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 käyttäessäsi mallia /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 (*) -kentässä /t * t/ -merkkimerkissä awk voi valita viimeisen vaihtoehdon:

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

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

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

    Seuraava esimerkki vastaa merkkijonoja, jotka alkavat joko K tai k ja sen jälkeen T :

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

    Ymmärrä merkit awk:

    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 yhden kirjaimen vastaavuutta
    5. [a-zA-Z 0-9] tarkoittaa, että vastaa yhtä kirjainta tai numeroa

    Katsotaanpa alla olevaa esimerkkiä:

    # 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ä.

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

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

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

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

    Sen avulla voit pitää sitä seuraavaa hahmoa kirjaimena, toisin sanoen miettiä sitä sellaisenaan.

    Alla olevassa esimerkissä ensimmäinen komento tulostaa tiedoston kaikki rivit, toinen komento ei tulosta mitään, koska haluan sovittaa rivin, jolla on 25,00 dollaria, mutta ei pako-merkkiä.

    Kolmas komento on oikea, koska pakomerkkiä on käytetty lukemaan $sellaisenaan.

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

    Yhteenveto

    Tämä ei ole kaikki awk-komentorivin suodatustyökalulla, yllä olevien esimerkkien kohdalla awk: n perustoiminnot. Seuraavissa osissa etenemme kuinka awk: n monimutkaisia ominaisuuksia käytetään. Kiitos lukemisesta ja mahdollisista lisäyksistä tai selvennyksistä, lähetä kommentti kommenttiosioon.