AWK yra galinga duomenimis pagrįsta programavimo kalba, kurios pradžia siekia ankstyvąsias „Unix“ dienas. Iš pradžių ji buvo skirta „vieno linijinio“ programoms rašyti, tačiau nuo to laiko ji virto visaverte programavimo kalba. AWK vardą gauna iš autorių inicialų - Aho, Weinbergerio ir Kernighano. „Linux“ ir kitų „Unix“ sistemų „awk“ komanda iškviečia vertėją, kuris paleidžia AWK scenarijus. Naujausiose sistemose egzistuoja keli „awk“ variantai, tokie kaip gawk (GNU awk), mawk (minimalus awk) ir nawk (New awk), be kitų. Peržiūrėkite toliau pateiktus pavyzdžius, jei norite įvaldyti awk.
Suprasti AWK programas
Programos, parašytos awk, susideda iš taisyklių, kurios yra tiesiog šablonų ir veiksmų pora. Šablonai sugrupuoti breketuose , o veiksmo dalis suaktyvinama, kai „awk“ randa šabloną atitinkančius tekstus. Nors „awk“ buvo sukurtas vienkartiniams rašikliams rašyti, patyrę vartotojai gali lengvai juo rašyti sudėtingus scenarijus.
AWK programos yra labai naudingos apdorojant didelio masto failus. Jis identifikuoja teksto laukus naudodamas specialius simbolius ir atskyrėjus. Ji taip pat siūlo aukšto lygio programavimo konstrukcijas, tokias kaip masyvai ir kilpos. Taigi rašyti tvirtas programas naudojant paprastą awk yra labai įmanoma.
Praktiniai „Linux“ „awk“ komandos pavyzdžiai
Administratoriai paprastai naudoja „awk“ duomenims išgauti ir pateikti ataskaitas greta kitų manipuliacijų failais. Žemiau aptarėme „awk“ išsamiau. Atidžiai vykdykite komandas ir išbandykite jas savo terminale, kad suprastumėte.
1. Spausdinkite konkrečius laukus iš teksto išvesties
Plačiausiai naudojamos „Linux“ komandos pateikia savo išvestį naudodamos įvairius laukus. Paprastai tam, kad iš tokių duomenų išgautume konkretų lauką, naudojame komandą „Linux cut“. Tačiau žemiau pateikta komanda parodo, kaip tai padaryti naudojant komandą awk.
$ kas | awk 'print $ 1'
Ši komanda parodys tik pirmąjį lauką iš komandos, kuris išvedė. Taigi, jūs tiesiog gausite visų šiuo metu prisijungę vartotojų vardus. Čia, 1 USD reiškia pirmąjį lauką. Jums reikia naudoti N $ jei norite išgauti N-ąjį lauką.
2. Spausdinkite kelis laukus iš teksto išvesties
„AWK“ vertėjas leidžia atspausdinti bet kokį norimų laukų skaičių. Žemiau pateiktuose pavyzdžiuose parodyta, kaip išskleisti pirmuosius du laukus iš komandos who išvesties.
$ kas | awk 'print $ 1, $ 2'
Taip pat galite valdyti išvesties laukų tvarką. Šiame pavyzdyje pirmiausia rodomas antrasis stulpelis, kurį sukūrė komanda, o tada pirmasis stulpelis antrame lauke.
$ kas | awk 'print $ 2, $ 1'
Tiesiog palikite lauko parametrus (N $), kad būtų rodomi visi duomenys.
3. Naudokite BEGIN teiginius
BEGIN sakinys leidžia vartotojams išspausdinti žinomą informaciją išvestyje. Paprastai jis naudojamas formuojant išvesties duomenis, kuriuos generuoja awk. Šio teiginio sintaksė parodyta žemiau.
PRADŽIA Veiksmai VEIKSMAS
Visada suaktyvinami veiksmai, kurie sudaro skiltį BEGIN. Tada awk vienas po kito skaito likusias eilutes ir mato, ar reikia ką nors padaryti.
$ kas | awk 'BEGIN print "User \ tFrom" print $ 1, $ 2'
Pirmiau nurodyta komanda žymės du išvesties laukus, išgautus iš komandos who išvesties.
4. Naudokite END teiginius
Taip pat galite naudoti teiginį END, kad įsitikintumėte, jog tam tikri veiksmai visada atliekami jūsų operacijos pabaigoje. Tiesiog po pagrindinio veiksmų rinkinio įdėkite skiltį END.
$ kas | awk 'BEGIN print "User \ tFrom" print $ 1, $ 2 END print "--COMPLETED--"'
Pirmiau nurodyta komanda pridės nurodytą eilutę išvesties pabaigoje.
5. Paieška naudojant šablonus
Didelė dalis „awk“ operacijų apima modelio derinimą ir regex. Kaip jau aptarėme, „awk“ ieško šablonų kiekvienoje įvesties eilutėje ir veiksmą atlieka tik tada, kai suveikia rungtis. Ankstesnės mūsų taisyklės buvo tik veiksmai. Žemiau mes iliustravome modelių derinimo pagrindus naudodami komandą „awk“ sistemoje „Linux“.
$ kas | awk '/ mary / print'
Ši komanda matys, ar vartotojas Mary šiuo metu yra prisijungęs, ar ne. Jei bus rasta atitiktis, ji išves visą eilutę.
6. Išgauti informaciją iš failų
Komanda awk labai gerai veikia su failais ir gali būti naudojama atliekant sudėtingas failų apdorojimo užduotis. Ši komanda parodo, kaip „awk“ tvarko failus.
$ awk '/ labas / print' / usr / share / dict / american-english
Ši komanda ieško šablono „labas“ Amerikos-anglų žodyno faile. Jis prieinamas daugumoje „Linux“ pagrindu veikiančių paskirstymų. Taigi šiame faile galite lengvai išbandyti awk programas.
7. Perskaitykite AWK scenarijų iš šaltinio failo
Nors rašyti vienos linijos programas yra naudinga, taip pat galite rašyti dideles programas visiškai naudodami „awk“. Jūs norite juos išsaugoti ir paleisti programą naudodami šaltinio failą.
$ awk -f scenarijaus failas $ awk - failo scenarijaus failas
The -f arba -failą parinktis leidžia mums nurodyti programos failą. Tačiau scenarijaus faile nereikia naudoti kabučių ("), nes" Linux "apvalkalas taip neišaiškins programos kodo.
8. Nustatykite įvesties lauko separatorių
Lauko skyriklis yra skiriklis, kuris padalija įvesties įrašą. Naudodami., Mes galime lengvai nurodyti laukų separatorius, kad jie būtų awk -F arba -lauko separatorius variantą. Peržiūrėkite toliau pateiktas komandas, kad pamatytumėte, kaip tai veikia.
$ echo "Tai-paprastas pavyzdys" | awk -F - 'print $ 1' $ echo "Tai-paprastas pavyzdys" | awk - field-separator - 'print $ 1'
Tai veikia taip pat, kai „Linux“ naudojate scenarijaus failus, o ne „one-liner awk“ komandą.
9. Spausdinti informaciją pagal būklę
„Linux cut“ komandą aptarėme ankstesniame vadove. Dabar mes parodysime, kaip išgauti informaciją naudojant „awk“ tik tada, kai atitinka tam tikrus kriterijus. Mes naudosime tą patį bandymo failą, kurį naudojome tame vadove. Taigi eikite ten ir padarykite testas.txt failą.
$ awk '$ 4> 50' testas.txt
Ši komanda atspausdins visas tautas iš bandymo.txt failas, kuriame gyvena daugiau nei 50 milijonų gyventojų.
10. Spausdinkite informaciją palygindami įprastus posakius
Ši komanda „awk“ patikrina, ar trečiosios bet kurios eilutės lauke yra raštas „Lira“, ir išspausdina visą eilutę, jei randama atitiktis. Mes vėl naudojame testą.txt failas, naudojamas „Linux cut“ komandai iliustruoti. Taigi prieš tęsdami įsitikinkite, kad turite šį failą.
$ awk '$ 3 ~ / Lira /' testas.txt
Jei norite, galite pasirinkti atspausdinti konkrečią bet kurios atitikties dalį.
11. Suskaičiuokite bendrą įvestų eilučių skaičių
Komandoje awk yra daug specialios paskirties kintamųjų, kurie leidžia mums lengvai atlikti daug pažangių dalykų. Vienas iš tokių kintamųjų yra NR, kuriame yra dabartinis eilutės numeris.
$ awk 'END print NR' testas.txt
Ši komanda išves, kiek eilučių yra mūsų bandyme.txt failas. Pirmiausia jis kartojasi kiekvienoje eilutėje, o pasiekęs END, atspausdins NR vertę - kurioje šiuo atveju yra visas eilučių skaičius.
12. Nustatykite išvesties lauko separatorių
Anksčiau mes parodėme, kaip pasirinkti įvesties lauko skyriklius naudojant -F arba -lauko separatorius variantą. Komanda awk taip pat leidžia mums nurodyti išvesties lauko skyriklį. Žemiau pateiktas pavyzdys tai parodo naudodamas praktinį pavyzdį.
$ data | awk 'OFS = "-" spausdinti $ 2, $ 3, $ 6'
Ši komanda išspausdina dabartinę datą naudodama formatą dd-mm-yy. Paleiskite datos programą be awk, kad pamatytumėte, kaip atrodo numatytasis išvestis.
13. „If Construct“ naudojimas
Kaip ir kitos populiarios programavimo kalbos, „awk“ taip pat suteikia vartotojams „if-else“ konstrukcijas. „Ifk“ sakinio „awk“ sintaksė yra žemiau.
if (išraiška) first_action second_action
Atitinkami veiksmai atliekami tik tuo atveju, jei sąlyginė išraiška yra teisinga. Žemiau pateiktame pavyzdyje tai parodoma naudojant mūsų nuorodų failą testas.txt.
$ awk 'if ($ 4> 100) print' testas.txt
Jums nereikia griežtai išlaikyti įtraukos.
14. „If-Else Constructs“ naudojimas
Naudodamiesi žemiau esančia sintakse, galite susikurti naudingas „if-else“ kopėčias. Jie yra naudingi kuriant sudėtingus „awk“ scenarijus, kurie tvarko dinaminius duomenis.
jei (išraiška) pirmasis reiškia kitas antrasis
$ awk 'if ($ 4> 100) spausdinti; else print 'testas.txt
Pirmiau nurodyta komanda atspausdins visą nuorodos failą, nes ketvirtasis laukas kiekvienoje eilutėje yra ne didesnis kaip 100.
15. Nustatykite lauko plotį
Kartais įvesties duomenys yra gana netvarkingi, todėl vartotojams gali būti sunku juos vizualizuoti savo ataskaitose. Laimei, „awk“ pateikia galingą integruotą kintamąjį, vadinamą FIELDWIDTHS, kuris leidžia mums apibrėžti tarpais atskirtą pločių sąrašą.
$ echo 5675784464657 | awk 'BEGIN FIELDWIDTHS = "3 4 5" spausdinti $ 1, $ 2, $ 3'
Tai labai naudinga analizuojant išsibarsčiusius duomenis, nes išvesties lauko plotį galime valdyti tiksliai taip, kaip norime.
16. Nustatykite įrašų skyriklį
RS arba įrašų separatorius yra dar vienas įmontuotas kintamasis, kuris leidžia mums nurodyti, kaip įrašai yra atskiriami. Pirmiausia sukurkime failą, kuris parodys šio awk kintamojo veikimą.
$ katė nauja.txt Melinda James 23 Naujasis Hampšyras (222) 466-1234 Daniel James 99 Phonenix Road (322) 677-3412
$ awk 'BEGIN FS = "\ n"; print $ 1, $ 3' new.txt
Ši komanda analizuos dokumentą ir išpjaus dviejų asmenų vardus bei pavardes ir adresus.
17. Spausdinti aplinkos kintamuosius
„Linux“ komanda awk leidžia mums lengvai spausdinti aplinkos kintamuosius naudojant kintamąjį ENVIRON. Žemiau pateikta komanda parodo, kaip tai naudoti atspausdinant PATH kintamojo turinį.
$ awk 'BEGIN spausdinti ENVIRON ["PATH"]'
Galite atsispausdinti bet kokio aplinkos kintamojo turinį pakeisdami ENVIRON kintamojo argumentą. Žemiau pateikta komanda išspausdina aplinkos kintamojo HOME vertę.
$ awk 'BEGIN spausdinti ENVIRON ["HOME"]'
18. Praleiskite kai kuriuos laukus iš „Output“
Komanda awk leidžia mums praleisti konkrečias eilutes iš mūsų išvesties. Ši komanda tai parodys naudodama mūsų nuorodų failą testas.txt.
$ awk -F ":" '$ 2 = ""; spausdinti 'testas.txt
Ši komanda praleis antrąjį failo stulpelį, kuriame yra kiekvienos šalies sostinės pavadinimas. Taip pat galite praleisti daugiau nei vieną lauką, kaip parodyta kitoje komandoje.
$ awk -F ":" '$ 2 = ""; $ 3 = ""; print' testas.txt
19. Pašalinkite tuščias eilutes
Kartais duomenyse gali būti per daug tuščių eilučių. Galite gana lengvai pašalinti tuščias eilutes naudodami komandą awk. Peržiūrėkite kitą komandą, kad sužinotumėte, kaip tai veikia praktiškai.
$ awk '/ ^ [\ t] * $ / kitas print' naujas.txt
Iš failo pašalinome visas tuščias eilutes.txt naudojant paprastą taisyklingą išraišką ir įtaisytą „awk“, vadinamą toliau.
20. Pašalinkite galines tarpus
Daugelio „Linux“ komandų išvestyje yra tarpų. Mes galime naudoti „Linux“ komandą „awk“, kad pašalintume tokius tarpus, kaip tarpai ir skirtukai. Peržiūrėkite toliau pateiktą komandą, kad sužinotumėte, kaip išspręsti tokias problemas naudojant „awk“.
$ awk 'sub (/ [\ \ t] * $ /, ""); print' naujas.txt testas.txt
Įtraukite keletą galinių tarpų į mūsų nuorodų failus ir patikrinkite, ar „awk“ juos sėkmingai pašalino, ar ne. Tai sėkmingai padarė mano mašina.
21. Patikrinkite laukų skaičių kiekvienoje eilutėje
Mes galime lengvai patikrinti, kiek laukų yra vienoje linijoje, naudodami paprastą „awk“ vieno įdėklo juostą. Yra daugybė būdų, kaip tai padaryti, tačiau šiai užduočiai atlikti naudosime kai kuriuos „awk“ įmontuotus kintamuosius. NR kintamasis nurodo eilutės numerį, o NF kintamasis pateikia laukų skaičių.
$ awk 'print NR, "->", NF' testas.txt
Dabar galime patvirtinti, kiek laukų yra mūsų eilutėje testas.txt dokumentas. Kadangi kiekvienoje šio failo eilutėje yra 5 laukai, mes esame tikri, kad komanda veikia taip, kaip tikėtasi.
22. Patvirtinkite dabartinį failo pavadinimą
Awk kintamasis FILENAME naudojamas tikrinti dabartinį įvesties failo pavadinimą. Mes demonstruojame, kaip tai veikia, naudodami paprastą pavyzdį. Tačiau tai gali būti naudinga tais atvejais, kai failo pavadinimas nėra aiškiai žinomas arba yra daugiau nei vienas įvesties failas.
$ awk 'print FILENAME' testas.txt $ awk 'print FILENAME' testas.txt naujas.txt
Aukščiau nurodytos komandos išspausdina failo pavadinimą, kurį veikia awk kiekvieną kartą, kai jis apdoroja naują įvesties failų eilutę.
23. Patikrinkite apdorotų įrašų skaičių
Šis pavyzdys parodys, kaip mes galime patikrinti komandų awk apdorotų įrašų skaičių. Kadangi daugybė „Linux“ sistemos administratorių ataskaitoms kurti naudoja „awk“, jiems tai labai naudinga.
$ awk 'print "Apdorojamas įrašas -", NR; END print "\ nVisi įrašai apdoroti:", NR;' testas.txt
Aš dažnai naudoju šį „awk“ fragmentą, kad turėčiau aiškią savo veiksmų apžvalgą. Galite lengvai jį pritaikyti, kad pritaikytumėte naujų idėjų ar veiksmų.
24. Atspausdinkite bendrą įrašo simbolių skaičių
„Awk“ kalba pateikia patogią funkciją, vadinamą length (), kuri nurodo, kiek simbolių yra įraše. Tai labai naudinga daugelyje scenarijų. Greitai pažvelkite į šį pavyzdį, kad pamatytumėte, kaip tai veikia.
$ echo "Atsitiktinė teksto eilutė ..." | awk 'spausdinimo ilgis (0 USD);
$ awk 'spausdinimo ilgis ($ 0); '/ etc / passwd
Pirmiau nurodyta komanda atspausdins bendrą kiekvienoje įvesties eilutės ar failo eilutėje esančių simbolių skaičių.
25. Spausdinkite visas ilgesnes už nurodytą ilgį
Kai kuriuos sąlyginius dalykus prie pirmiau nurodytos komandos galime pridėti ir priversti spausdinti tik tas eilutes, kurios yra ilgesnės nei iš anksto nustatytos. Tai naudinga, kai jau turite idėją apie konkretaus įrašo ilgį.
$ echo "Atsitiktinė teksto eilutė ..." | awk 'ilgis (0 USD)> 10'
$ awk 'ilgis ($ 0)> 5; '/ etc / passwd
Galite įvesti daugiau parinkčių ir (arba) argumentų, kad pritaikytumėte komandą pagal savo reikalavimus.
26. Spausdinkite eilučių, simbolių ir žodžių skaičių
Ši „Linux“ komanda „awk“ išspausdina eilučių, simbolių ir žodžių skaičių tam tikrame įvestyje. Šiai operacijai atlikti naudojamas NR kintamasis ir tam tikra pagrindinė aritmetika.
$ echo "Tai įvesties eilutė ..." | awk 'w + = NF; c + = ilgis + 1 PABAIGA spausdinti NR, w, c '
Tai rodo, kad įvesties eilutėje yra 1 eilutė, 5 žodžiai ir tiksliai 24 simboliai.
27. Apskaičiuokite žodžių dažnumą
Norėdami apskaičiuoti dokumento žodžio dažnį, galime sujungti asociatyvius masyvus ir for loop in awk. Ši komanda gali atrodyti šiek tiek sudėtinga, tačiau ji yra gana paprasta, kai jūs aiškiai suprantate pagrindines konstrukcijas.
$ awk 'PRADŽIA FS = "[^ a-zA-Z] +" for (i = 1; i<=NF; i++) words[tolower($i)]++ END for (i in words) print i, words[i] ' test.txt
Jei kyla problemų dėl vieno linijinio fragmento, nukopijuokite šį kodą į naują failą ir paleiskite jį naudodami šaltinį.
$ cat> dažnis.awk PRADŽIA FS = "[^ a-zA-Z] +" for (i = 1; i<=NF; i++) words[tolower($i)]++ END for (i in words) print i, words[i]
Tada paleiskite jį naudodami -f variantą.
$ awk -f dažnis.awk testas.txt
28. Pervardykite failus naudodami AWK
Komanda awk gali būti naudojama norint pervardyti visus failus, atitinkančius tam tikrus kriterijus. Ši komanda parodo, kaip naudoti awk visiems pervadinant .MP3 failus kataloge į .mp3 failai.
$ touch a, b, c, d, e.MP3 $ ls *.MP3 | awk 'printf ("mv \"% s \ ""\""% s \ ""\ n"", $ 0, tolower ($ 0))' $ ls *.MP3 | awk 'printf (""mv \""% s \ ""\""% s \ ""\ n"", $ 0, tolower ($ 0))' | sh
Pirmiausia mes sukūrėme keletą demonstracinių failų su .MP3 plėtinys. Antroji komanda parodo vartotojui, kas nutinka, kai pervadinti pavyksta. Galiausiai paskutinė komanda pervadina operaciją naudodama „mv“ komandą „Linux“.
29. Atspausdinkite skaičiaus kvadratinę šaknį
AWK siūlo kelias įmontuotas funkcijas, skirtas manipuliuoti skaitmenimis. Viena iš jų yra sqrt () funkcija. Tai yra į C panaši funkcija, kuri grąžina nurodyto skaičiaus kvadratinę šaknį. Greitai pažvelkite į kitą pavyzdį, kad pamatytumėte, kaip tai veikia apskritai.
$ awk 'BEGIN print sqrt (36)