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 awkja 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 kasutada FS välja eraldaja muutuja sisendteksti lugemiseks koolonitega eraldatud väljadega (:).
  • Kasuta OFS väljundvälja eraldaja öelda awk 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.