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:
- Tavalliset merkit, kuten välilyönti, alaviiva (_), A-Z, a-z, 0-9.
- Sisällönkuvahahmot, jotka on laajennettu tavallisiin merkkeihin, sisältävät:
-
(.)
se vastaa mitä tahansa yksittäistä merkkiä paitsi uuden rivin. -
(*)
se vastaa nollaa tai useampaa sitä edeltävän välittömän merkin olemassaoloa. -
[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. -
^
se vastaa tiedoston rivin alkua. -
$
vastaa tiedoston rivin loppua. -
\
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 kirjaimellat
ja päättyvätt
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 merkina
tail
tai1
rivillä tiedostossa/etc/hosts.# awk '/[al1]/{print}' /etc/hosts
Seuraava esimerkki vastaa merkkijonoja, jotka alkavat joko
K
taik
ja sen jälkeenT
:# awk '/[Kk]T/{print}' /etc/hosts
Ymmärrä merkit awk:
-
[0-9]
tarkoittaa yhtä numeroa -
[a-z]
tarkoittaa, että vastaa yhtä pientä kirjainta -
[A-Z]
tarkoittaa, että vastaa yhtä isoa kirjainta -
[a-zA-Z]
tarkoittaa yhden kirjaimen vastaavuutta -
[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.
-