Kun suoritamme tiettyjä komentoja Unix/Linuxissa tekstin lukemiseksi tai muokkaamiseksi merkkijonosta tai tiedostosta, yritämme useimmiten suodattaa tuloksen tiettyyn kiinnostavaan osaan. Tässä on kätevää käyttää säännöllisiä lausekkeita.
Lue myös:10 hyödyllistä Linux -ketjutusoperaattoria käytännön esimerkeillä
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 tuloksen, muokata teksti- tai määritystiedoston osaa ja niin edelleen.
Säännölliset lausekkeet koostuvat seuraavista:
(.)
se vastaa mitä tahansa yksittäistä merkkiä paitsi uutta riviä.(*)
se vastaa nollaa tai enemmän sitä edeltävän välittömän merkin olemassaoloa.[merkki (t)]
se vastaa mitä tahansa merkissä määritettyjä merkkejä, voidaan käyttää myös yhdysviivaa
(-)
tarkoittaa erilaisia hahmoja, kuten [a-f]
, [1-5]
, ja niin edelleen.^
se vastaa tiedoston rivin alkua.$
vastaa tiedoston rivin loppua.\
se on pakohahmo.Tekstin suodattamiseen on käytettävä tekstinsuodatustyökalua, kuten awk. Voit ajatella awk omana ohjelmointikielenä. Mutta tämän oppaan soveltamisalaan awk, me käsittelemme sitä yksinkertaisena komentorivisuodatustyökaluna.
Awk: n yleinen syntaksi on:
# awk 'script' tiedostonimi.
Missä 'käsikirjoitus'
on joukko komentoja, jotka ymmärretään awk ja suoritetaan tiedostossa, tiedostonimi.
Se toimii lukemalla tietyn rivin tiedostosta, kopioimalla rivin ja suorittamalla sitten komentosarjan rivillä. Tämä toistetaan kaikilla tiedoston riveillä.
'käsikirjoitus'
on muodossa '/ kuvio/ toiminta'
missä kuvio on säännöllinen lauseke ja toiminta mitä awk tekee, kun se löytää annetun kuvion riviltä.
Seuraavissa esimerkeissä keskitymme metamerkkeihin, joista keskustelimme yllä awk -ominaisuuksien alla.
Alla oleva esimerkki tulostaa kaikki tiedoston rivit /etc/hosts koska mitään mallia ei ole annettu.
# awk '//{print} '/etc/hosts.
Alla oleva esimerkki, malli paikallinen isäntä
on annettu, joten awk vastaa rivin ottamista paikallinen isäntä että /etc/hosts
tiedosto.
# awk '/localhost/{print} ' /etc /hosts
(.)
vastaa merkkijonoja, jotka sisältävät loc, paikallinen isäntä, localnet alla olevassa esimerkissä.
Toisin sanoen * l joku_hahmo c *.
# awk '/l.c/{print} ' /etc /hosts.
Se vastaa merkkijonoja, jotka sisältävät paikallinen isäntä, localnet, linjat, kykenevä, kuten alla olevassa esimerkissä:
# awk '/l*c/{print} ' /etc /localhost.
Ymmärrät myös sen (*)
yrittää saada pisin mahdollinen ottelu, jonka se voi havaita.
Katsotaanpa tapausta, joka osoittaa tämän, ota säännöllinen lauseke t*t
mikä tarkoittaa kirjain alkavia merkkijonoja t
ja lopettaa t
alla olevalla rivillä:
tämä on tecmint, josta saat parhaat hyvät opetusohjelmat, ohjeet, oppaat, tecmint.
Saat seuraavat vaihtoehdot, kun käytät mallia /t*t/
:
tämä on t. tämä on tecmint. tämä on tecmint, josta saat t. tämä on tecmint, josta saat parasta hyvää. tämä on tecmint, josta saat parhaat hyvät opetusohjelmat. tämä on tecmint, josta saat parhaat hyvät opetusohjelmat, kuinka niitä, oppaita, t. tämä on tecmint, josta saat parhaat hyvät opetusohjelmat, miten tos, oppaat, tecmint.
Ja (*)
sisään /t*t/
Jokerimerkki antaa awkille mahdollisuuden valita viimeinen vaihtoehto:
tämä on tecmint, josta saat parhaat hyvät opetusohjelmat, ohjeet, oppaat, tecmint.
Otetaan esimerkiksi setti [al1]
, täällä awk vastaa kaikkia merkkijonoja a
tai l
tai 1
tiedoston rivillä /etc/hosts.
# awk '/[al1]/{print} ' /etc /hosts.
Seuraava esimerkki vastaa merkkijonoja, jotka alkavat joko K
tai k
jonka jälkeen T
:
# awk '/[Kk]T/{print} ' /etc /hosts
Ymmärrä hahmot awkin avulla:
[0-9]
tarkoittaa yhtä numeroa[a-z]
tarkoittaa yhtä pientä kirjainta[A-Z]
tarkoittaa yhtä isoa kirjainta[a-zA-Z]
tarkoittaa yhden kirjaimen vastaavuutta[a-zA-Z 0-9]
tarkoittaa yhtä kirjainta tai numeroaKatsotaanpa esimerkkiä alla:
# awk '/[0-9]/{print} ' /etc /hosts
Koko rivi tiedostosta /etc/hosts sisältää ainakin yhden numeron [0-9]
yllä olevassa esimerkissä.
Se vastaa kaikkia rivejä, jotka alkavat alla olevassa esimerkissä esitetyllä kuviolla:
# awk '/^fe/{print} ' /etc /hosts. # awk '/^ff/{print} ' /etc /hosts.
Se vastaa kaikkia rivejä, jotka päättyvät annettuun kaavaan:
# awk '/ab$/{print} ' /etc /hosts. # awk '/ost$/{print} ' /etc /hosts. # awk '/rs$/{print} ' /etc /hosts.
Sen avulla voit ottaa sitä seuraavan hahmon kirjaimena, 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 yhdistää rivin, jossa on $25.00, mutta pakohahmoa ei käytetä.
Kolmas komento on oikea, koska lukemiseen on käytetty pakohahmoa $ niin kuin se on.
# awk '//{print} 'deal.txt. # awk '/$25.00/{print} 'deal.txt. # awk '/\$25.00/{print} 'deal.txt.
Se ei ole kaikki awk komentorivisuodatustyökalu, yllä olevat esimerkit ja awk: n perustoiminnot. Seuraavissa osissa aiomme edetä awk: n monimutkaisten ominaisuuksien käyttämisessä. Kiitos, että luit läpi ja mahdollisista lisäyksistä tai selvennyksistä, lähetä kommentti kommenttiosioon.