Kuidas kasutada käsku awk Linuxis
Linuxisawk
on käsurea tekst manipuleerimise dünamo, samuti võimas skriptikeel. Siin on sissejuhatus selle lahedamatesse omadustesse.
Kui awk sai selle nime
Theawk
käsu nimetamiseks kasutati kolme inimese algustähte, kes kirjutasid 1977. aastal algversiooni: Alfred Aho, Peter Weinberger ja Brian Kernighan. Need kolm meest olid legendaarsest AT&T Bell Laboratories Unixi panteonist. Sellest ajast peale paljude teiste panusega awk
on edasi arenenud.
See on täielik skriptikeel ja ka käsurea täielik teksti manipuleerimise tööriistakomplekt. Kui see artikkel tekitab teie isu, saate tutvuda kõigi üksikasjadegaawk
ja selle funktsionaalsus.
Reeglid, mustrid ja toimingud
awk
töötab programmidega, mis sisaldavad mustritest ja toimingutest koosnevaid reegleid. Toiming viiakse läbi tekstiga, mis sobib mustriga. Mustrid on ümbritsetud lokkis traksidega ({}
). Muster ja toiming moodustavad koos reegli. Kogu awk
programm on lisatud ühte jutumärki ('
).
Vaatame kõige lihtsamat tüüpi awk
programmi. Sellel pole mustrit, seega sobib see iga sinna sisestatud tekstireaga. See tähendab, et toiming viiakse läbi igal real. Kasutame seda WHO
käsk.
Siin on standardväljund WHO
:
WHO
Võib-olla pole meil kogu seda teavet vaja, vaid soovime lihtsalt näha kontodel olevaid nimesid. Me saame toru väljundi WHO
sisse awk
ja siis ütle awk
ainult esimese välja printimiseks.
Algselt, awk
peab väljaks tühimärgiga ümbritsetud tähemärki, rea algust või rea lõppu. Väljad tähistatakse dollarimärgiga ($
) ja number. Niisiis,$1
tähistab esimest välja, mida kasutame koos printida
toiming esimese välja printimiseks.
Sisestame järgmise:
kes | awk '{print $ 1}'
awk
prindib esimese välja ja viskab ülejäänud rea kõrvale.
Saame printida nii palju välju, kui meile meeldib. Kui lisame eraldajana koma,awk
prindib iga välja vahele tühiku.
Sisestame järgmise teabe, et printida ka sisse logitud aeg (väli neli):
kes | awk '{print $ 1, $ 4}'
Seal on paar spetsiaalset välitunnust. Need tähistavad tervet tekstirida ja viimast välja tekstireas:
- $0: Esindab kogu tekstirida.
- $1: Esindab esimest välja.
- $2: Esindab teist välja.
- $7: Esindab seitsmendat välja.
- $45: Esindab 45. välja.
- $ NF: Tähistab väljade arvu ja tähistab viimast välja.
Väikese tekstifaili kuvamiseks, mis sisaldab lühikest tsitaati, mille omistab Dennis Ritchie, sisestame järgmised.
kass dennis_ritchie.txt
Me tahameawk
tsitaadi esimese, teise ja viimase välja printimiseks. Pange tähele, et kuigi see on ümber terminaliakna, on see vaid üks tekstirida.
Sisestame järgmise käsu:
awk '{print $ 1, $ 2, $ NF}' dennis_ritchie.txt
Me ei tea seda "lihtsust". on tekstivälja 18. väli ja see ei huvita meid. Mida me teame, on see viimane väli ja seda saame kasutada $ NF
selle väärtuse saamiseks. Perioodi peetakse lihtsalt teiseks tegelaseks väljal.
Väljundväljade eraldajate lisamine
Võite ka öelda awk
konkreetse märgi väljade vahele printimiseks vaikeruumi asemel. Vaikeväljundkuupäev
käsk on veidi omapärane, sest aeg on selle keskel. Siiski võime tippida järgmise ja kasutada awk
soovitud väljade väljavõtmiseks:
kuupäev
kuupäev | awk '{print $ 2, $ 3, $ 6}'
Kasutame OFS
(väljundvälja eraldaja) muutuja, et panna eraldaja kuu, päeva ja aasta vahele. Pange tähele, et allpool lisame käsu üksikutesse jutumärkidesse ('
), mitte lokkis traksid ({}
):
kuupäev | awk 'OFS = "/" {print $ 2, $ 3, $ 6}'
kuupäev | awk 'OFS = "-" {printige $ 2, $ 3, $ 6}'
Reeglid BEGIN ja END
A Alusta
reegel täidetakse üks kord enne tekstitöötluse algust. Tegelikult hukatakse see varem awk
loeb isegi suvalist teksti. An LÕPP
reegel täidetakse pärast kogu töötlemise lõppu. Teil võib olla mitu Alusta
jaLÕPP
reeglid ja nad täidavad järjekorras.
Meie näiteks Alusta
reegel, trükime kogu tsitaadi saidilt dennis_ritchie.txt
fail, mida me varem kasutasime, pealkirjaga selle kohal.
Selleks tippime selle käsu:
awk 'BEGIN {print "Dennis Ritchie"} {print $ 0}' dennis_ritchie.txt
Pange tähele Alusta
Reeglil on oma tegevuste kogum, mis on ümbritsetud oma lokkide traksidega ({}
).
Sama tehnikat saame kasutada käsuga, mida kasutasime väljundi torustamiseks varem WHO
sisse awk
. Selleks sisestame järgmise teksti:
kes | awk 'BEGIN {print "Aktiivsed seansid"} {print $ 1, $ 4}'
Sisestusvälja eraldajad
Kui sa tahad awk
töötamiseks tekstiga, mis ei kasuta väljade eraldamiseks tühikut, peate ütlema, millist tähemärki tekst kasutab väljaeraldajana. Näiteks / etc / passwd
fail kasutab koolonit (:
) väljade eraldamiseks.
Kasutame seda faili ja -F
(eraldaja string) võimalus öelda awk
kasutada koolonit (:
) eraldajana. Tippime ütlemiseks järgmise awk
Kasutajakonto nime ja kodukausta printimiseks toimige järgmiselt.
awk -F: '{print $ 1, $ 6}' / etc / passwd
Väljund sisaldab kasutajakonto nime (või rakenduse või deemoni nime) ja kodukausta (või rakenduse asukohta).
Mustrite lisamine
Kui kõik, mis meid huvitab, on tavalised kasutajakontod, võime kõigi teiste kirjete filtreerimiseks lisada oma printimistoimingusse mustri. Kuna User ID numbrid on võrdsed või suuremad kui 1000, saame oma teabe aluseks võtta selle teabe.
Trükkimistoimingu käivitamiseks sisestame järgmise, kui kolmas väli ($3
) sisaldab väärtust 1000 või rohkem:
awk -F: '$ 3> = 1000 {print $ 1, $ 6}' / etc / passwd
Muster peaks vahetult eelnema toimingule, millega see on seotud.
Saame kasutada Alusta
reegel, et anda meie väikesele aruandele pealkiri. Sisestame järgmise, kasutades\ n
) märge uue rea märgi lisamiseks pealkirjastringi:
awk -F: 'BEGIN {print "Kasutajakontod \ n -------------"} $ 3> = 1000 {print $ 1, $ 6}' / etc / passwd
Mustrid on täieõiguslikud regulaaravaldised ja need on üks kuulsustest awk
.
Oletame, et soovime näha ühendatud failisüsteemide universaalselt unikaalseid identifikaatoreid (UUID). Kui otsime läbi / etc / fstab
fail stringi „UUID” esinemiste jaoks, peaks see selle teabe meile tagastama.
Kasutame oma käsus otsingumustrit “/ UUID /”:
awk '/ UUID / {print $ 0}' / etc / fstab
See leiab kõik „UUID” esinemised ja prindib need read. Me oleksime tegelikult sama tulemuse saanud ilma printida
toiming, kuna vaiketoiming prindib kogu tekstirea. Selguse huvides on siiski kasulik olla selgesõnaline. Skripti või ajaloofaili sirvides on teil hea meel, et jätsite endale vihjed.
Esimene leitud rida oli kommenteerimisrida ja kuigi string „UUID” on selle keskel, awk
ikka leidis. Me võime regulaaravaldist näpistada ja öelda awk
töödelda ainult ridu, mis algab tähega „UUID”. Selleks sisestame järgmise, mis sisaldab rea märgendi algust (^
):
awk '/ ^ UUID / {print $ 0}' / etc / fstab
See on parem! Nüüd näeme ainult ehtsaid kinnitamisjuhiseid. Väljundi veelgi täpsustamiseks sisestame järgmise ja piirame kuva esimese väljaga:
awk '/ ^ UUID / {print $ 1}' / etc / fstab
Kui meil oleks sellele masinale paigaldatud mitu failisüsteemi, saaksime nende UUID-dest korraliku tabeli.
Sisseehitatud funktsioonid
awk
on palju funktsioone, mida saate helistada ja kasutada oma programmides nii käsurealt kui ka skriptides. Kui teete mõnda kaevet, on see teie jaoks väga viljakas.
Funktsiooni kutsumise üldise tehnika demonstreerimiseks vaatame mõnda numbrilist. Näiteks prinditakse järgmine ruutjuur 625:
awk 'BEGIN {print sqrt (625)}'
See käsk prindib arktangendi 0 (null) ja -1 (mis on juhtumisi matemaatiline konstant pi):
awk 'BEGIN {print atan2 (0, -1)}'
Järgmises käsus muudame tulemust atan2 ()
enne printimist:
awk 'BEGIN {print atan2 (0, -1) * 100}'
Funktsioonid võivad väljendeid parameetritena aktsepteerida. Näiteks siin on keerukas viis 25 ruutjuure küsimiseks:
awk 'BEGIN {print sqrt ((2 + 3) * 5)}'
awk Skriptid
Kui teie käsurida muutub keerukaks või kui teil on välja töötatud rutiin, mida soovite uuesti kasutada, saate oma käsud üle kanda awk
käsk skripti.
Näidiskriptis teeme kõik järgmised:
- Öelge kestale, millist käivitatavat faili skripti käitamiseks kasutada.
- Valmistuge
awk
kasutadaFS
välja eraldaja muutuja sisendteksti lugemiseks koolonitega eraldatud väljadega (:
). - Kasuta
OFS
väljundvälja eraldaja öeldaawk
kasutada kooloneid (:
), et eraldada väljundis väljad. - Määrake loenduriks 0 (null).
- Määrake iga tekstirea teine väli tühjaks väärtuseks (see on alati "x", nii et me ei pea seda nägema).
- Printige rida muudetud teise väljaga.
- Suurendage loendurit.
- Trükkige loenduri väärtus.
Meie skript on näidatud allpool.
The Alusta
reegel viib ette ettevalmistusetapid, samas kuiLÕPP
reegel kuvab loenduri väärtuse. Keskmine reegel (millel pole nime ega mustrit, nii et see sobiks iga reaga) muudab teist välja, prindib joone ja suurendab loendurit.
Skripti esimene rida ütleb kestale, millist käivitatavat faili kasutada (awk
(meie näites) skripti käitamiseks. See läbib ka -f
(failinimi) valik awk
, mis teavitab töödeldavat teksti failist. Edastame failinime skriptile, kui seda käivitame.
Lisasime allpool oleva skripti tekstina, et saaksite lõigata ja kleepida:
#! / usr / bin / awk -f BEGIN {# määrake sisend- ja väljundväljade eraldajad FS = ":" OFS = ":" # nullige kontode loendurikontod = 0} {# määrake väljal 2 mitte midagi $ 2 = "" # kogu rea printimine printimine $ 0 # teise konto kontode loendamine ++} LÕPP {# tulemuste printimine kontode "kontode printimine. \ n"}
Salvestage see faili nimega jätma vahele. awk
. Skripti käivitatavaks muutmiseks sisestame järgmise abil chmod
:
chmod + x jätke välja.awk
Nüüd käivitame selle ja läbime / etc / passwd
fail skripti. See on failawk
töötleb meie eest skripti reegleid kasutades:
./omit.awk / etc / passwd
Fail töödeldakse ja kuvatakse iga rida, nagu allpool näidatud.
Teise välja „x” kirjed eemaldati, kuid pange tähele, et väljade eraldajad on endiselt olemas. Ridad loendatakse ja kogusumma antakse väljundi lõpus.
awk ei seisa ebamugava eest
awk
ei seisa ebamugava eest; see tähistab elegantsi. Seda on kirjeldatud kui töötlusfiltrit ja aruannete kirjutajat. Täpsemalt öeldes on see mõlemad need või pigem tööriist, mida saate kasutada mõlema ülesande jaoks. Vaid mõne reagaawk
saavutab selle, mis nõuab ulatuslikku kodeerimist traditsioonilises keeles.
Selle jõu kasutab ära reeglite lihtne kontseptsioon, mis sisaldab mustreid, valivad töödeldava teksti, ja toimingud, mis määratlevad töötlemise.