Paano Magamit ang awk Command sa Linux
Sa Linux,ang awkward
ay isang dynamo na pagmamanipula ng teksto ng linya ng utos, pati na rin isang malakas na wika ng pag-script. Narito ang isang pagpapakilala sa ilan sa mga pinaka-cool na tampok.
Gaano Kakayanin ang Pangalan Nito
Angang awkward
Ang utos ay pinangalanan gamit ang mga inisyal ng tatlong tao na sumulat ng orihinal na bersyon noong 1977: Alfred Aho, Peter Weinberger, at Brian Kernighan. Ang tatlong lalaking ito ay nagmula sa maalamat na AT&T Bell Laboratories Unix pantheon. Sa mga kontribusyon ng marami pang iba mula noon, ang awkward
ay patuloy na nagbabago.
Ito ay isang buong wika ng scripting, pati na rin ang isang kumpletong toolkit ng pagmamanipula ng teksto para sa linya ng utos. Kung pinalalabas ng artikulong ito ang iyong gana sa pagkain, maaari mong suriin ang bawat detalye tungkol saang awkward
at ang pagpapaandar nito.
Mga Panuntunan, pattern, at pagkilos
ang awkward
gumagana sa mga program na naglalaman ng mga patakaran na binubuo ng mga pattern at pagkilos. Ang aksyon ay naisakatuparan sa teksto na tumutugma sa pattern. Ang mga pattern ay nakapaloob sa mga kulot na tirante ({}
). Sama-sama, isang pattern at isang aksyon ang bumubuo ng isang panuntunan. Ang buong ang awkward
ang programa ay nakapaloob sa iisang mga quote ('
).
Tingnan natin ang pinakasimpleng uri ng ang awkward
programa Wala itong pattern, kaya tumutugma ito sa bawat linya ng teksto na pinasok dito. Nangangahulugan ito na ang aksyon ay naisakatuparan sa bawat linya. Gagamitin namin ito sa output mula sa sino
utos
Narito ang karaniwang output mula sa sino
:
sino
Marahil ay hindi namin kailangan ang lahat ng impormasyong iyon, ngunit, sa halip, nais lamang na makita ang mga pangalan sa mga account. Maaari nating mai-tubo ang output mula sa sino
sa ang awkward
, at pagkatapos ay sabihin ang awkward
upang mai-print lamang ang unang patlang.
Bilang default, ang awkward
isinasaalang-alang ang isang patlang na isang string ng mga character na napapaligiran ng whitespace, ang pagsisimula ng isang linya, o ang pagtatapos ng isang linya. Ang mga patlang ay nakilala sa pamamagitan ng isang dolyar na tanda ($
) at isang numero. Kaya,$1
kumakatawan sa unang patlang, na gagamitin namin sa mag-print
aksyon upang mai-print ang unang patlang.
Na-type namin ang sumusunod:
sino | awk '{print $ 1}'
ang awkward
naka-print ang unang patlang at itinapon ang natitirang linya.
Maaari kaming mag-print ng maraming mga patlang hangga't gusto namin. Kung nagdagdag kami ng isang kuwit bilang isang separator,ang awkward
naglilimbag ng puwang sa pagitan ng bawat patlang.
Na-type namin ang sumusunod upang mai-print din ang oras na nag-log in ang tao (patlang apat):
sino | awk '{print $ 1, $ 4}'
Mayroong isang pares ng mga espesyal na tagakilala sa larangan. Kinakatawan nito ang buong linya ng teksto at ang huling patlang sa linya ng teksto:
- $0: Kinakatawan ang buong linya ng teksto.
- $1: Kinakatawan ang unang larangan.
- $2: Kinakatawan ang pangalawang larangan.
- $7: Kinakatawan ang ikapitong larangan.
- $45: Kinakatawan ang ika-45 na patlang.
- $ NF: Tumayo para sa "bilang ng mga patlang," at kumakatawan sa huling patlang.
I-type namin ang sumusunod upang maglabas ng isang maliit na file ng teksto na naglalaman ng isang maikling quote na maiugnay kay Dennis Ritchie:
cat dennis_ritchie.txt
Gusto naminang awkward
upang mai-print ang una, pangalawa, at huling larangan ng quote. Tandaan na kahit na nakabalot ito sa window ng terminal, isa lang itong linya ng teksto.
Nai-type namin ang sumusunod na utos:
awk '{print $ 1, $ 2, $ NF}' dennis_ritchie.txt
Hindi namin alam ang "pagiging simple." ay ang ika-18 patlang sa linya ng teksto, at wala kaming pakialam. Ang alam namin ay ito ang huling larangan, at maaari naming gamitin $ NF
upang makuha ang halaga nito. Ang panahon ay isinasaalang-alang lamang ng isa pang character sa katawan ng patlang.
Pagdaragdag ng Mga Separator ng Output na Patlang
Maaari mo ring sabihin ang awkward
upang mai-print ang isang partikular na character sa pagitan ng mga patlang sa halip na ang default na character na space. Ang default na output mula sapetsa
ang utos ay bahagyang kakaiba dahil ang oras ay naka-plonked mismo sa gitna nito. Gayunpaman, maaari naming mai-type ang sumusunod at gamitin ang awkward
upang makuha ang mga patlang na gusto namin:
petsa
petsa | awk '{print $ 2, $ 3, $ 6}'
Gagamitin namin ang OFS
(output field separator) variable upang maglagay ng isang separator sa pagitan ng buwan, araw, at taon. Tandaan na sa ibaba ay nakapaloob namin ang utos sa iisang mga quote ('
), hindi mga kulot na tirante ({}
):
petsa | awk 'OFS = "/" {print $ 2, $ 3, $ 6}'
petsa | awk 'OFS = "-" {print $ 2, $ 3, $ 6}'
Ang Mga Panuntunan sa PAGSIMULA at WAKAS
A MAGSIMULA
ang patakaran ay naisagawa nang isang beses bago magsimula ang anumang pagproseso ng teksto. Sa katunayan, naisagawa ito dati ang awkward
kahit na nagbabasa ng anumang teksto. Isang WAKAS
ang patakaran ay naisakatuparan matapos makumpleto ang lahat ng pagproseso. Maaari kang magkaroon ng maramihang MAGSIMULA
atWAKAS
mga panuntunan, at isasagawa nila nang maayos.
Para sa aming halimbawa ng a MAGSIMULA
panuntunan, mai-print namin ang buong quote mula sa dennis_ritchie.txt
ginamit namin dati ang file na may pamagat sa itaas nito.
Upang magawa ito, nai-type namin ang utos na ito:
awk 'BEGIN {print "Dennis Ritchie"} {print $ 0}' dennis_ritchie.txt
Tandaan ang MAGSIMULA
ang panuntunan ay may sariling hanay ng mga aksyon na nakapaloob sa loob ng sarili nitong hanay ng mga kulot na tirante ({}
).
Maaari naming gamitin ang parehong diskarteng ito sa utos na ginamit namin dati upang mag-output ng tubo mula sino
sa ang awkward
. Upang magawa ito, nai-type namin ang sumusunod:
sino | awk 'BEGIN {print "Mga Aktibong Session"} {print $ 1, $ 4}'
Mga Naghihiwalay sa Patlang ng Input
Kung gusto mo ang awkward
upang gumana sa teksto na hindi gumagamit ng whitespace upang paghiwalayin ang mga patlang, kailangan mong sabihin dito kung aling character ang ginagamit ng teksto bilang separator ng patlang. Halimbawa, ang / atbp / passwd
ang file ay gumagamit ng isang colon (:
) upang paghiwalayin ang mga patlang.
Gagamitin namin ang file na iyon at ang -F
(string ng separator) na pagpipilian upang sabihin ang awkward
gamitin ang tutuldok (:
) bilang naghihiwalay. Nai-type namin ang sumusunod upang sabihin ang awkward
upang mai-print ang pangalan ng account ng gumagamit at ang folder ng bahay:
awk -F: '{print $ 1, $ 6}' / etc / passwd
Naglalaman ang output ng pangalan ng account ng gumagamit (o application o pangalan ng daemon) at ang folder ng bahay (o ang lokasyon ng application).
Pagdaragdag ng Mga pattern
Kung ang lahat ng interesado namin ay regular na mga account ng gumagamit, maaari kaming magsama ng isang pattern sa aming aksyon sa pag-print upang i-filter ang lahat ng iba pang mga entry. Dahil ang mga numero ng User ID ay katumbas ng, o mas malaki sa, 1,000, maaari naming ibase ang aming filter sa impormasyong iyon.
Na-type namin ang sumusunod upang maisagawa lamang ang aming aksyon sa pag-print kapag ang pangatlong patlang ($3
) naglalaman ng halagang 1,000 o higit pa:
awk -F: '$ 3> = 1000 {print $ 1, $ 6}' / etc / passwd
Ang pattern ay dapat na agad na mauna sa pagkilos na nauugnay dito.
Maaari nating gamitin ang MAGSIMULA
patakaran na magbigay ng isang pamagat para sa aming maliit na ulat. Na-type namin ang sumusunod, gamit ang (\ n
) notasyon upang magsingit ng isang bagong character sa string ng pamagat:
awk -F: 'BEGIN {print "Mga User Account \ n -------------"} $ 3> = 1000 {print $ 1, $ 6}' / etc / passwd
Ang mga pattern ay ganap na regular na expression, at isa sila sa mga kaluwalhatian ng ang awkward
.
Sabihin nating nais nating makita ang mga natatanging natatanging pagkakakilanlan (UUID) ng mga naka-mount na mga file system. Kung hahanapin natin ang / atbp / fstab
mag-file para sa mga paglitaw ng string na "UUID," dapat itong ibalik ang impormasyong iyon para sa amin.
Ginagamit namin ang pattern ng paghahanap na "/ UUID /" sa aming utos:
awk '/ UUID / {print $ 0}' / etc / fstab
Nahanap nito ang lahat ng mga paglitaw ng "UUID" at naka-print ang mga linya na iyon. Talagang makukuha namin ang parehong resulta nang wala ang mag-print
aksyon dahil ang default na aksyon ay naka-print sa buong linya ng teksto. Gayunpaman, para sa kalinawan, madalas na kapaki-pakinabang na maging malinaw. Kapag tiningnan mo ang isang script o iyong file ng kasaysayan, matutuwa kang iniwan mo ang mga pahiwatig para sa iyong sarili.
Ang unang nahanap na linya ay isang linya ng komento, at bagaman ang string na "UUID" ay nasa gitna nito, ang awkward
natagpuan pa rin ito. Maaari nating sabunutan ang regular na expression at sabihin ang awkward
upang maproseso ang mga linya lamang na nagsisimula sa “UUID.” Upang magawa ito, nai-type namin ang sumusunod na kasama ang pagsisimula ng linya ng token (^
):
awk '/ ^ UUID / {print $ 0}' / etc / fstab
Mas maganda iyan! Ngayon, nakikita lamang namin ang tunay na mga tagubilin sa pag-mount. Upang pinuhin pa ang output, nai-type namin ang sumusunod at pinaghihigpitan ang pagpapakita sa unang larangan:
awk '/ ^ UUID / {print $ 1}' / etc / fstab
Kung mayroon kaming maraming mga system ng file na naka-mount sa makina na ito, makakakuha kami ng maayos na mesa ng kanilang mga UUID.
Mga Built-In na Pag-andar
ang awkward
ay may maraming mga pagpapaandar na maaari mong tawagan at gamitin sa iyong sariling mga programa, kapwa mula sa linya ng utos at sa mga script. Kung gumawa ka ng paghuhukay, masusumpungan mo itong napaka-mabunga.
Upang maipakita ang pangkalahatang pamamaraan upang tumawag sa isang pagpapaandar, titingnan namin ang ilang mga bilang ng bilang. Halimbawa, ang sumusunod na mga kopya ng square root ng 625:
awk 'BEGIN {print sqrt (625)}'
Ang print na ito ay naglilimbag ng arctangent ng 0 (zero) at -1 (na kung saan ay magiging pare-pareho ang matematika, pi):
awk 'BEGIN {print atan2 (0, -1)}'
Sa sumusunod na utos, binago namin ang resulta ng atan2 ()
gumana bago namin ito mai-print:
awk 'BEGIN {print atan2 (0, -1) * 100}'
Maaaring tanggapin ng mga pagpapaandar ang mga expression bilang mga parameter. Halimbawa, narito ang isang nagbabagong paraan upang humingi ng parisukat na ugat ng 25:
awk 'BEGIN {print sqrt ((2 + 3) * 5)}'
awk Mga Script
Kung naging kumplikado ang iyong linya ng utos, o bumuo ka ng isang gawain na alam mong nais mong gamitin muli, maaari mong ilipat ang iyong ang awkward
utos sa isang iskrip.
Sa aming halimbawa ng script, gagawin namin ang lahat ng sumusunod:
- Sabihin sa shell kung aling maipapatupad na gamitin upang patakbuhin ang script.
- Maghanda ka
ang awkward
upang magamit angFS
variable ng separator ng patlang upang mabasa ang teksto ng pag-input na may mga patlang na pinaghiwalay ng mga colon (:
). - Gamitin ang
OFS
maghihiwalay ng patlang ng output upang sabihinang awkward
gumamit ng mga colon (:
) upang paghiwalayin ang mga patlang sa output. - Magtakda ng isang counter sa 0 (zero).
- Itakda ang pangalawang patlang ng bawat linya ng teksto sa isang blangko na halaga (palaging isang "x," kaya hindi namin ito kailangan makita).
- I-print ang linya sa binagong pangalawang patlang.
- Palakihin ang counter.
- I-print ang halaga ng counter.
Ang aming script ay ipinapakita sa ibaba.
Ang MAGSIMULA
isinasagawa ng panuntunan ang mga hakbang sa paghahanda, habang angWAKAS
ipinapakita ng panuntunan ang halaga ng counter. Ang gitnang panuntunan (na walang pangalan, o pattern sa gayon tumutugma ito sa bawat linya) binabago ang pangalawang patlang, pini-print ang linya, at nadaragdagan ang counter.
Sinasabi ng unang linya ng script ang shell kung aling maipapatupad na gamitin (ang awkward
, sa aming halimbawa) upang patakbuhin ang script. Ipinapasa rin nito ang -f
(filename) na pagpipilian upang ang awkward
, na ipapaalam dito ang teksto na ipoproseso nito ay magmumula sa isang file. Ipapasa namin ang filename sa script kapag pinatakbo namin ito.
Isinama namin ang script sa ibaba bilang teksto upang maaari mong i-cut at i-paste:
#! / usr / bin / awk -f MAGSIMULA {# itakda ang mga separator ng patlang ng pag-input at output FS = ":" OFS = ":" # zero ang mga account counter account = 0} {# itakda ang patlang 2 sa wala $ 2 = "" # i-print ang buong linya na naka-print $ 0 # bilangin ang isa pang account account ++} TAPOS {# i-print ang mga resulta mag-print ng mga account "account. \ n"}
I-save ito sa isang file na tinawag omit.awk
. Upang maipapatupad ang script, nai-type namin ang sumusunod gamit ang chmod
:
chmod + x omit.awk
Ngayon, tatakbo namin ito at maipapasa ang / atbp / passwd
file sa script. Ito ang fileang awkward
iproseso para sa amin, gamit ang mga panuntunan sa loob ng script:
./omit.awk / etc / passwd
Naproseso ang file at ipinapakita ang bawat linya, tulad ng ipinakita sa ibaba.
Ang mga "x" na entry sa pangalawang patlang ay inalis, ngunit tandaan na ang mga naghihiwalay sa patlang ay naroroon pa rin. Ang mga linya ay binibilang at ang kabuuan ay ibinibigay sa ilalim ng output.
awk Hindi Tumayo para Awkward
ang awkward
hindi naninindigan para sa mahirap; ito ay kumakatawan sa kagandahan. Inilarawan ito bilang isang filter sa pagpoproseso at isang manunulat ng ulat. Mas tumpak, pareho ito sa, o, sa halip, isang tool na maaari mong gamitin para sa pareho ng mga gawaing ito. Sa ilang mga linya lamang,ang awkward
nakakamit kung ano ang nangangailangan ng malawak na pag-coding sa isang tradisyunal na wika.
Ang kapangyarihang iyon ay ginagamit ng simpleng konsepto ng mga patakaran na naglalaman ng mga pattern, na pumipili ng teksto sa proseso, at mga aksyon na tumutukoy sa pagproseso.