BASH: tumia mkalimani wa awk. Kuchagua safu mlalo kutoka safu fulani. Maneno na Vitalu

Utangulizi wa lugha ya ajabu yenye jina geni

Daniel Robbins, Rais/Mkurugenzi Mtendaji, Gentoo Technologies, Inc.

Maelezo: Awk ni lugha ya ajabu yenye jina la ajabu sana. Katika makala haya ya kwanza ya mfululizo wa sehemu tatu, Daniel Robbins anatoa utangulizi mfupi katika misingi ya programu katika awk. Makala yajayo katika mfululizo huu yatashughulikia mada za kina zaidi, na kumalizia na ombi dhabiti, la ulimwengu halisi la onyesho la awk.

Makala hii tags: awk

Bendera hii!

Tarehe: 01/29/2009

Kiwango cha ugumu: rahisi

Maoni: 0 (Tazama | Ongeza maoni - Ingia)

Kadiria nakala hii

Katika utetezi wa awk

Katika mfululizo huu wa makala, nitamfanya msomaji awe mtayarishaji programu mwenye ujuzi. Ninakubali kwamba awk haina jina zuri zaidi au la mtindo zaidi, na toleo la GNU la awk, linaloitwa gawk, linasikika kuwa la kushangaza kabisa. Watayarishaji programu ambao hawajui lugha hii, wakisikia jina lake, wanaweza kufikiria mishmash ya msimbo wa zamani na wa zamani ambao unaweza kusababisha wazimu zaidi. mtaalamu mwenye ujuzi juu ya UNIX (iliyomsababisha kutamka "kuua -9!" na kukimbia mara kwa mara kwa kahawa).

Ndio, sivyo jina la ajabu. Lakini ni lugha ya ajabu. Awk imeundwa kwa ajili ya usindikaji wa maandishi na kuripoti, lakini ina vipengele vingi vilivyotengenezwa vyema vinavyowezesha utayarishaji wa kina. Walakini, tofauti na lugha zingine, syntax ya awk inajulikana na hukopa bora zaidi kutoka kwa lugha kama vile C, python na bash (ingawa rasmi awk iliundwa kabla ya chatu na bash). Awk ni mojawapo ya lugha ambazo, mara tu zinapojifunza, huwa sehemu muhimu ya silaha za kimkakati za mtengenezaji wa programu.

Hatua ya kwanza katika awk

Wacha tuanze na tujaribu kujaribu awk kuona jinsi inavyofanya kazi. Kwenye mstari wa amri, ingiza amri ifuatayo: $ awk "( print)" /etc/passwd

Matokeo yanapaswa kuonyesha yaliyomo kwenye /etc/passwd faili. Sasa - maelezo ya kile awk alifanya. Wakati wa kupiga simu awk, tulibainisha /etc/passwd kama faili ya ingizo. Wakati tuliendesha awk, ilichakata amri ya kuchapisha kwa kila mstari katika /etc/passwd kwa utaratibu. Matokeo yote yalitumwa kwa stdout na tulipata matokeo sawa na matokeo amri za paka/etc/passwd. Sasa hebu tueleze ( print ) block. katika awk braces hutumika kupanga vipande vya maandishi, kama katika C. Sehemu yetu ya maandishi ina amri moja tu ya kuchapisha. Kwa awk amri ya kuchapisha haina vigezo vya ziada huchapisha yaliyomo yote mstari wa sasa.

Hapa kuna mfano mwingine wa programu ya awk ambayo hufanya kitu sawa: $ awk "( print $0 )" /etc/passwd

Katika awk, kigezo cha $0 kinawakilisha mstari mzima wa sasa, kwa hivyo chapisha na uchapishe $0 fanya vivyo hivyo. Ukipenda, unaweza kuunda programu katika awk ambayo itatoa data isiyohusiana kabisa na data ya ingizo. Hapa kuna mfano: $ awk "( print "" )" /etc/passwd

Unapopitisha kamba "" kwa amri ya kuchapisha, daima huchapisha kamba tupu. Ukijaribu hati hii, utagundua kuwa awk hutoa laini moja tupu kwa kila mstari ndani /etc/passwd. Hii inatokea tena kwa sababu awk hutoa hati kwa kila mstari kwenye faili ya ingizo. Hapa kuna mfano mwingine: $ awk "( chapisha "hiya" )" /etc/passwd

Ukiendesha hati hii, itajaza skrini na maneno "yay". :)

Sehemu nyingi

Awk inafaa vyema kwa kuchakata maandishi ambayo yamegawanywa katika sehemu nyingi za kimantiki, na hurahisisha kufikia kila sehemu ya mtu binafsi kutoka ndani ya hati ya awk. Hati ifuatayo itachapisha orodha ya akaunti zote kwenye mfumo: $ /etc/passwd

Katika simu ya awk katika mfano hapo juu, chaguo la -F linabainisha ":" kama kitenganishi cha uga. Wakati wa kuchakata amri ya kuchapisha $1, awk huchapisha sehemu ya kwanza inayopatikana kwenye kila mstari wa faili ya ingizo. Hapa kuna mfano mwingine: $ awk -F":" ( chapisha $1 $3 )" /etc/passwd

Hapa kuna kipande kutoka kwa matokeo ya skrini ya hati hii:halt7

Kama unavyoona, awk hutoa sehemu za kwanza na tatu za faili ya /etc/passwd, ambayo ni jina la mtumiaji na sehemu za uid, mtawaliwa. Wakati huo huo, ingawa hati inafanya kazi, sio kamili - hakuna nafasi kati ya sehemu mbili za pato! Wale ambao wamezoea kupanga programu katika bash au python wanaweza kutarajia agizo la kuchapisha $1 $3 kuingiza nafasi kati ya sehemu hizi mbili. Walakini, wakati mistari miwili iko karibu na kila mmoja katika programu ya awk, awk inawaunganisha bila kuongeza nafasi kati yao. Amri ifuatayo itaingiza nafasi kati ya sehemu: $ awk -F":" ( chapisha $1 " " $3 )" /etc/passwd

Chapisho linapoitwa hivi, huambatanisha $1, " " na $3 katika mfululizo, na kutoa matokeo yanayoweza kusomeka na binadamu kwenye skrini. Bila shaka, tunaweza pia kuingiza lebo za sehemu ikihitajika: $ awk -F":" "( chapisha "jina la mtumiaji: " $1 "\t\tuid: " $3" )" /etc/passwd

Kama matokeo, tunapata pato lifuatalo: jina la mtumiaji: halt uid:7

jina la mtumiaji: operator uid:11

jina la mtumiaji: mzizi uid:0

jina la mtumiaji: shutdown uid:6

jina la mtumiaji: Sync uid:5

jina la mtumiaji: bin uid:1

Maandishi ya nje

Kupitisha hati kwa awk kama hoja mstari wa amri inaweza kuwa rahisi kwa maandishi madogo ya mstari mmoja, lakini linapokuja suala la programu ngumu za safu nyingi, hakika itakuwa bora kuandika hati kama. faili ya nje. Kisha unaweza kuelekeza awk kwa faili hii ya hati kwa kutumia -f:$ awk -f myscript.awk myfile.in chaguo

Kuweka maandishi katika faili tofauti za maandishi pia hukuruhusu kuchukua faida faida za ziada awk. Kwa mfano, hati ifuatayo ya safu-nyingi hufanya kitu sawa na moja ya safu zetu za awali - huchapisha sehemu ya kwanza ya kila mstari kutoka /etc/passwd: BEGIN (

Tofauti kati ya njia hizi mbili ni jinsi tunavyobainisha kitenganishi cha shamba. Katika hati hii, kitenganishi cha shamba kinatajwa ndani na programu yenyewe (kwa kuweka tofauti ya FS), ambapo katika mfano wetu wa awali, FS imeundwa kwa kupitisha awk the -F":" chaguo kwenye mstari wa amri. Kawaida ni bora kutaja kitenganishi cha uga ndani ya hati yenyewe, kwa sababu tu haitakuhitaji kukumbuka hoja nyingine ya safu ya amri. Tutaangalia utofauti wa FS kwa undani zaidi baadaye katika nakala hii.

ANZA na MWISHO vitalu

Kwa kawaida awk hutekeleza kila kizuizi kwenye maandishi ya hati mara moja kwa kila mstari wa ingizo. Walakini, mara nyingi kuna hali katika upangaji ambapo unahitaji kutekeleza nambari ya uanzishaji kabla awk kuanza kuchakata maandishi kutoka kwa faili ya ingizo. Kwa hali kama hizi, awk hutoa uwezo wa kufafanua kizuizi cha BEGIN. Tulitumia kizuizi cha BEGIN katika mfano uliopita. Kwa sababu kizuizi cha BEGIN kinachakatwa kabla ya awk kuanza kuchakata faili ya ingizo, hapa ni mahali pazuri pa kuanzisha utofautishaji wa FS (kitenganisha uwanja), kutoa kichwa, au kuanzisha vigeu vingine vya kimataifa ambavyo vitatumika baadaye katika programu.

Awk pia hutoa kizuizi kingine maalum kinachoitwa END block. Awk hutekeleza kizuizi hiki baada ya mistari yote kwenye faili ya ingizo kuchakatwa. Kwa kawaida, kizuizi cha END hutumiwa kufanya hesabu za mwisho au matokeo ya matokeo ambayo yanapaswa kuonekana mwishoni mwa mtiririko wa matokeo.

Maneno ya kawaida na vizuizi

Awk hukuruhusu kutumia maneno ya kawaida kwa utekelezaji uliochaguliwa wa vizuizi vya programu mahususi kulingana na kama usemi wa kawaida unalingana na mstari wa sasa au la. Hapa kuna maandishi ya mfano ambayo huchapisha tu mistari ambayo ina mlolongo wa herufi foo:/foo/ ( print )

Bila shaka, unaweza kutumia maneno magumu zaidi ya kawaida. Hapa kuna hati ambayo itachapisha tu mistari iliyo na kuelea: /+\.*/ ( print )

Maneno na Vitalu

Kuna njia zingine nyingi za kuchagua kwa kuchagua kizuizi cha programu. Tunaweza kuweka usemi wowote wa Boolean mbele ya kizuizi cha programu ili kudhibiti utekelezaji wa kizuizi hicho. Awk itatekeleza kizuizi cha programu ikiwa tu usemi wa awali wa Boolean utatathmini kuwa kweli. Nakala ya mfano ifuatayo itatoa uwanja wa tatu wa mistari yote ambapo uwanja wa kwanza umetolewa. Ikiwa sehemu ya kwanza ya laini ya sasa si fred, awk itaendelea kuchakata faili na haitatoa taarifa ya kuchapisha kwa mstari wa sasa: :$1 == "fred" ( print $3 )

Awk inatoa seti kamili waendeshaji kulinganisha, pamoja na "==", " ya kawaida<", ">", "<=", ">=" na "!=". Kwa kuongeza, awk hutoa viendeshaji "~" na "!~", ambayo inamaanisha "inalingana" na "hailingani." Wanaweka kigezo upande wa kushoto wa opereta na usemi wa kawaida. kulia kwake Hapa kuna mfano ambapo ni sehemu ya tatu pekee ya mstari imechapishwa ikiwa sehemu ya tano ya mstari huo huo ina mzizi wa mfuatano wa herufi:$5 ~ /root/ ( print $3 )

Kauli zenye masharti

Awk pia hutoa C-kama nzuri sana ikiwa taarifa. Ukipenda, unaweza kuandika upya hati iliyotangulia kwa kutumia if:(

ikiwa ($5 ~ /mzizi/) (

Maandishi yote mawili hufanya kazi sawa. Katika mfano wa kwanza, usemi wa boolean uko nje ya kizuizi, wakati katika mfano wa pili, kizuizi kinatekelezwa kwa kila mstari wa ingizo, na tunateua kwa kuchagua amri ya kuchapisha kwa kutumia taarifa ya if. Mbinu zote mbili hufanya kazi, na tunaweza kuchagua moja. hiyo njia bora huunganishwa na sehemu zingine za hati.

Hapa kuna zaidi mfano tata ikiwa taarifa katika awk. Kama unavyoona, hata na masharti magumu yaliyowekwa kiota, ikiwa taarifa zinaonekana sawa na wenzao wa C:(

ikiwa ($1 == "foo") (

ikiwa ($2 == "foo") (

) vinginevyo ikiwa ($1 == "bar") (

Kwa kutumia kama taarifa, tunaweza kubadilisha kanuni hii: ! /matchme/ ( chapisha $1 $3 $4)

kama hii: (

ikiwa ($0 !~ /matchme/) (

Hati zote mbili zitachapisha tu mistari ambayo haina mfuatano wa herufi za mechi. Na katika kesi hii, pia, unaweza kuchagua njia ambayo inafanya kazi vizuri katika programu fulani. Wote wawili wanafanya kitu kimoja.

Awk pia hukupa uwezo wa kutumia viendeshaji vya Boolean "||" ("mantiki AU") na "&&" ("mantiki NA"), ambayo hukuruhusu kuunda misemo changamano zaidi ya Kiboole: ($1 == "foo") &&& ($2 == "bar") ( print )

Mfano huu utatoa tu safu ambapo uga wa kwanza ni foo na uga wa pili ni upau.

Vigezo vya nambari!

Kufikia sasa tumechapisha vigeu vya kamba, kamba nzima, au sehemu maalum. Walakini, awk pia hutupatia uwezo wa kulinganisha nambari kamili na nambari za nukta zinazoelea. Kwa kutumia maneno ya hisabati, ni rahisi sana kuandika hati inayohesabu nambari mistari tupu katika faili. Hapa kuna hati moja kama hii: BEGIN ( x=0 )

END ( chapisha "Imepatikana " x " mistari tupu. :)"

Katika kizuizi cha BEGIN, tunaanzisha utofauti wetu kamili wa x hadi sifuri. Kisha, kila wakati awk inapokutana na mstari tupu, itatekeleza taarifa x=x+1, ikiongeza x kwa 1. Mara tu mistari yote imechakatwa, kizuizi cha END kitatekelezwa, na awk itachapisha jumla ya mwisho, ikionyesha. idadi ya mistari tupu iliyopatikana.

Vigezo vya kamba

Mojawapo ya mambo mazuri juu ya anuwai ya awk ni kwamba ni "wazi na herufi ndogo." Ninaita vijiti vya awk "kamba" kwa sababu anuwai zote za awk zimehifadhiwa ndani kama kamba. Wakati huo huo, vijiti vya awk ni "rahisi" kwa sababu unaweza kufanya shughuli za kihesabu kwenye kutofautisha, na ikiwa ina sahihi. mstari wa nambari, awk itashughulikia kiotomatiki kubadilisha kamba kuwa nambari. Ili kuona ninachomaanisha, angalia mfano huu: x="1.01"

# Tulifanya x iwe na *kamba* "1.01"

# Tumeongeza 1 kwa *kamba*

# Haya ni maoni, kwa njia :)

Awk itatoa:2.01

Kudadisi! Ingawa tuliweka thamani ya mfuatano 1.01 hadi x, bado tuliweza kuiongeza moja. Hatukuweza kufanya hivi kwa bash au python. Kwanza kabisa, bash haitumii hesabu ya sehemu inayoelea. Na wakati bash ina vijiti vya "kamba", sio "rahisi"; kutekeleza lolote shughuli za hisabati bash inatuhitaji tufunge mahesabu yetu kwa muundo mbaya $(). Ikiwa tulikuwa tunatumia python, tungehitaji kubadilisha kwa uwazi kamba yetu 1.01 hadi thamani ya sehemu inayoelea kabla ya kufanya hesabu yoyote nayo. Ingawa si vigumu, bado ni hatua ya ziada. Katika kesi ya awk, yote haya yanafanywa moja kwa moja, na inafanya msimbo wetu kuwa mzuri na safi. Ikiwa tungehitaji kuweka mraba sehemu ya kwanza ya kila mfuatano wa ingizo na kuongeza moja kwake, tungetumia hati kama hii:( print ($1^2)+1 )

Ukijaribu kidogo, utagundua kuwa ikiwa kigezo hakina nambari halali, awk itachukulia utaftaji huo kama sifuri ya nambari wakati wa kutathmini usemi wa kihesabu.

Waendeshaji wengi

Kipengele kingine kizuri cha awk ni seti kamili waendeshaji hisabati. Kando na nyongeza ya kawaida, kutoa, kuzidisha na kugawanya, awk inatupa uwezo wa kutumia kielekezi kilichoonyeshwa hapo awali "^", opereta salio. mgawanyiko kamili"%" na waendeshaji wengine wengi wanaofaa wa kazi waliokopwa kutoka kwa C.

Hizi ni pamoja na waendeshaji mgawo wa awali na baada ya ongezeko/upungufu (i++, --foo), waendeshaji mgawo kwa kuongeza/kutoa/kuzidisha/kugawanya (a+=3, b*=2, c/=2.2, d-=6.2) . Lakini si hivyo tu - pia tuna waendeshaji kazi rahisi kwa kukokotoa salio la mgawanyiko kamili na ufafanuzi (a^=2, b%=4).

Vitenganishi vya shamba

awk ina seti yake ya anuwai maalum. Baadhi yao hufanya iwezekanavyo urekebishaji mzuri awk inafanya kazi, na zingine zina habari muhimu kuhusu pembejeo. Tayari tumegusa mojawapo ya vigezo hivi maalum, FS. Kama ilivyotajwa hapo awali, utofauti huu hukuruhusu kutaja mlolongo wa herufi ambazo awk itazingatia kama kitenganishi cha uwanja. Tulipotumia /etc/passwd kama pembejeo, FS iliwekwa kuwa ":". Hii ilitosha, lakini FS inatupa kubadilika zaidi.

Thamani ya utofauti wa FS sio lazima iwe herufi moja; inaweza kupewa usemi wa kawaida unaobainisha muundo wa herufi wa urefu wowote. Ikiwa unashughulikia sehemu zilizotenganishwa na herufi moja au zaidi ya kichupo, basi FS lazima isanidiwe kama ifuatavyo: FS="\t+"

Hapo juu tulitumia tabia maalum usemi wa kawaida "+" unaomaanisha "tukio moja au zaidi la mhusika aliyetangulia".

Ikiwa sehemu zimetenganishwa na nafasi nyeupe (nafasi moja au zaidi au vichupo), unaweza kutaka kuweka FS kwa usemi ufuatao wa kawaida:FS="[[:space:]+]"

Ingawa usanidi huu utafanya kazi, sio lazima. Kwa nini? Kwa sababu thamani chaguo-msingi ya FS ni herufi moja ya nafasi, ambayo awk hutafsiri kama "nafasi moja au zaidi au tabo". Katika yetu mfano maalum Thamani chaguo-msingi ya FS ndiyo hasa tuliyohitaji!

Pia hakuna matatizo na maneno magumu ya kawaida. Hata kama rekodi zitatenganishwa na neno "foo" na kufuatiwa na tarakimu tatu, usemi ufuatao wa kawaida utachanganua data kwa usahihi: FS="foo"

Idadi ya mashamba

Vigezo viwili vinavyofuata ambavyo tutaviangalia kwa kawaida havikusudiwa kuandikwa, bali vinatumika kusoma na kupata. habari muhimu kuhusu pembejeo. Ya kwanza ya haya ni tofauti ya NF, pia inaitwa "idadi ya mashamba". Awk huweka kiotomati thamani ya kigeu hiki kwa idadi ya sehemu katika rekodi ya sasa. Unaweza kutumia utofauti wa NF kuonyesha tu mistari fulani ya ingizo: NF == 3 ( chapisha "kuna sehemu tatu katika ingizo hili: " $0 )

Kwa kweli, utofauti wa NF pia unaweza kutumika katika kauli zenye masharti, Kwa mfano:(

ikiwa (NF> 2) (

chapisha $1 " "$2":"$3

Nambari ya kumbukumbu

Tofauti nyingine inayofaa ni nambari ya rekodi (NR). Daima ina nambari ya rekodi ya sasa (awk inazingatia rekodi ya kwanza kuwa nambari ya rekodi 1). Hadi sasa tumeshughulikia faili za kuingiza, ambayo ilikuwa na ingizo moja kwa kila mstari. Katika hali kama hizi, NR pia itaripoti nambari ya sasa ya laini. Walakini, tunapoanza kushughulikia rekodi za safu nyingi katika nakala za baadaye za safu hii, hii haitakuwa hivyo tena, kwa hivyo tahadhari lazima ifanyike! NR inaweza kutumika kama utofauti wa NF kwa pato pekee mistari fulani pembejeo:(NR< 10) || (NR >100) ( chapisha "Tuko kwenye rekodi nambari 1-9 au 101 au zaidi")

Mfano mmoja zaidi:(

ikiwa (NR> 10) (

chapa "sasa taarifa za kweli zinakuja!"

Awk hutoa vibadala vya ziada ambavyo vinaweza kutumika kwa madhumuni mbalimbali. Tutaangalia vigezo hivi katika makala zijazo. Tumefika mwisho wa uchunguzi wetu wa awali wa awk. Katika makala yajayo katika mfululizo, nitaonyesha utendakazi wa hali ya juu zaidi wa awk, na tutamalizia mfululizo huu kwa programu ya awk ya ulimwengu halisi. Wakati huo huo, ikiwa unataka kujifunza zaidi, unaweza kuangalia rasilimali zilizoorodheshwa hapa chini.

04.10.2015
16:55

Huduma ya awk ni mfano wa classic Programu za Linux kwa usindikaji wa maandishi. Inatumika sana na inafaa, ingawa haitoi lugha kamili ya programu. Walakini, hakikisha kuwa uwezo wake unatosha kutatua shida nyingi. usindikaji otomatiki maandishi (hasa yanapojumuishwa na huduma zingine za kiweko).

Njia za kuendesha programu za awk

Ikiwa programu ya awk ni rahisi sana na fupi, basi nambari yake inaweza kuandikwa moja kwa moja kwenye koni:

Awk"< код awk-программы >" < имя_файла_для_обработки >

Unaweza kutumia zaidi ya awk kama pembejeo: faili za maandishi, lakini pia pato ndani mkondo wa kawaida maombi mengine:

< некое_приложение >| sawa"< код awk-программы >"

Katika kesi ambapo msimbo wa programu ya awk ni kubwa kabisa au lazima uhifadhiwe tumia tena, inaweza kuitwa kutoka kwa faili iliyo na -f swichi:

Awk -f< имя_файла_с_кодом_awk_программы > < имя_файла_для_обработки >

Ili kufanya majaribio, tunatumia faili test.cpp, ambayo tutaangalia matokeo ya programu za awk:

#pamoja na #pamoja na #pamoja na mtihani batili1(); int test2(); // Maoni ya mtindo wa C kwa main() kazi int main(int argc, char** argv) ( std::cout<< "Hello, world!" << std::endl; for(int i = 0; i < 10; ++i) { std::cout << i << std::endl; } return 0; } // Комментарий в стиле С для функции test1() void test1() { std::cout << "Hello, test1!" << std::endl; } // Комментарий в стиле С для функции test2() int test2() { std::cout << "Hello, test2!" << std::endl; }

Utangazaji

Kuchuja masharti kwa kutumia awk

Kwanza kabisa, awk hukuruhusu kuchagua mistari kutoka kwa maandishi kulingana na misemo ya kawaida na hali zingine za nambari.

Kuchagua mifuatano inayolingana na usemi wa kawaida

Kwa mfano, ili kupata mistari yote katika faili ya test.cpp iliyo na #include preprocessor maelekezo, tunatumia amri ifuatayo:

Awk "/^#\s*jumuisha/" test.cpp

Usemi wa kawaida umeandikwa kati ya wahusika wawili /. Kama matokeo, tunapata:

#pamoja na #pamoja na #pamoja na

Kuchagua mifuatano ambayo HAIlingani na usemi wa kawaida

Ili kuacha mistari yote ambayo hailingani na usemi wa kawaida, tumia amri kutoka kwa kifungu kidogo kilichopita na uongeze alama ya mshangao mwanzoni mwa msimbo wa awk. Kwa mfano, kwa njia hii tutatenga mistari yote ya maoni:

Awk "! /^[/](2).*/" test.cpp

Hivi ndivyo vilivyosalia:

#pamoja na #pamoja na #pamoja na mtihani batili1(); int test2(); int main(int argc, char** argv) ( std::cout<< "Hello, world!" << std::endl; for(int i = 0; i < 10; ++i) { std::cout << i << std::endl; } return 0; } void test1() { std::cout << "Hello, test1!" << std::endl; } int test2() { std::cout << "Hello, test2!" << std::endl; }

Kuchagua safu mlalo kutoka safu fulani

Unaweza kufafanua safu ya mifuatano ya kuonyesha kwenye skrini kwa kutumia misemo miwili ya kawaida, ikitenganishwa na koma. Kama mfano, wacha tupate ufafanuzi wa kazi zote zinazorudisha int:

Awk "/^int .*(.*) (/, /^)/" test.cpp

Matokeo husika:

Int main(int argc, char** argv) ( std::cout<< "Hello, world!" << std::endl; for(int i = 0; i < 10; ++i) { std::cout << i << std::endl; } return 0; } int test2() { std::cout << "Hello, test2!" << std::endl; }

Kuchanganya hali ya chujio

Ili kuangalia mifuatano dhidi ya masharti kadhaa mara moja, tumia && (AND) na || waendeshaji. (AU).

Amri ifuatayo inachapisha maoni yote ambayo hayana kuu:

Awk "/[/](2).*/ && ! /main/" test.cpp

Kama matokeo, tunayo:

// Maoni ya mtindo wa C kwa kitendakazi cha test1() // Maoni ya mtindo wa C kwa kitendakazi cha test2().

Hapo awali, tulitafuta safu ya mistari kwa kutumia misemo miwili ya kawaida, lakini ikiwa nambari za mstari zinazohitaji kutolewa zinajulikana mapema, basi kila kitu kimerahisishwa:

Awk "4< NR && NR < 7" test.cpp

NR ni tofauti ya awk inayobainisha nambari ya mstari. Kwa hivyo, nambari iliyowasilishwa hutoa mistari ya 5 na 6:

Jaribio la utupu1(); int test2();

Uteuzi wa mistari kulingana na masharti kuhusu maneno ya mtu binafsi

Awk inaweza kuchuja maandishi sio tu kwa mistari, lakini pia kwa maneno mahususi. Neno i -th katika mstari linaweza kurejelewa kwa kutumia $i . Kuhesabu huanza saa moja, na $0 inafafanua maudhui ya mstari mzima. Idadi ya maneno katika mstari imedhamiriwa kwa kutumia NF kutofautiana, kwa hivyo $NF inaelekeza kwa neno la mwisho. Kwa mfano, hebu tutafute mistari ambayo neno lake la kwanza ni int au batili:

Awk "$1 == "int" || $1 == "batili"" test.cpp

Toleo linalolingana la kiweko:

Jaribio la utupu1(); int test2(); int main(int argc, char** argv) ( batili test1() ( int test2() (

Walakini, ni rahisi kutumia ukaguzi wa kawaida wa usemi dhidi ya neno. Ili kufanya hivyo, awk hutoa opereta maalum ~, ambayo lazima iwekwe kati ya kutofautisha inayoelekeza kwa neno na usemi wa kawaida. Kama mfano, wacha tuandike tena amri ya hapo awali kwa fomu ngumu zaidi:

Awk "$1 ~ /int|void/" test.cpp

Chagua safu kulingana na sifa za nambari

Viendeshaji hesabu za lugha C vinapatikana kwa lugha ya awk, ambayo hukupa uhuru wa kutenda. Mfano hapa chini unachapisha mistari yote sawa (NR ndio nambari ya mstari):

Awk "NR % 2 == 0" test.cpp

Pato husika:

#pamoja na int test2(); // Maoni ya mtindo wa C kwa main() kazi std::cout<< "Hello, world!" << std::endl; for(int i = 0; i < 10; ++i) { } return 0; void test1() { } // Комментарий в стиле С для функции test2() std::cout << "Hello, test2!" << std::endl;

Programu ifuatayo ya awk inachapisha mistari yote ambayo neno lake la 1 lina urefu wa tatu:

Awk "length($1) == 3" test.cpp

Kama matokeo, tunapata:

Int test2(); int main(int argc, char** argv) ( int test2() (

Awk "NF == 2" test.cpp

Na matokeo yanayolingana:

#pamoja na #pamoja na #pamoja na mtihani batili1(); int test2(); kurudi 0;

Utangazaji

Kufanya kazi na kamba katika awk

Kama unavyoona, awk ina seti nzuri ya kazi za kuchuja mifuatano ya maandishi. Walakini, bado unaweza kufanya mabadiliko kadhaa kwenye safu hizi. Amri za kamba lazima zimefungwa kwa braces za curly (...). Msimbo katika mabano huitwa kwa kufuatana kwa kila mstari wa maandishi yanayochakatwa.

Toleo lililoumbizwa

Awk ina sawa moja kwa moja na kitendakazi cha C lugha printf(). Kama mfano, wacha tuchapishe nambari yake mwanzoni mwa kila mstari:

Awk "( printf "%-2d %s\n", NR, $0 )" test.cpp

Hivi ndivyo tulivyopata:

1 #pamoja na 2 #pamoja na 3 #pamoja na 4 5 mtihani batili1(); 6 int mtihani2(); 7 8 // Maoni ya mtindo wa C kwa main() kitendakazi 9 int main(int argc, char** argv) ( 10 std::cout<< "Hello, world!" << std::endl; 11 12 for(int i = 0; i < 10; ++i) { 13 std::cout << i << std::endl; 14 } 15 16 return 0; 17 } 18 19 // Комментарий в стиле С для функции test1() 20 void test1() { 21 std::cout << "Hello, test1!" << std::endl; 22 } 23 24 // Комментарий в стиле С для функции test2() 25 int test2() { 26 std::cout << "Hello, test2!" << std::endl; 27 }

Vitendaji vya ubadilishaji

Kwa kuongeza printf(), awk ina kazi zingine. Kwa mfano, print() na toupper() :

Awk "( print toupper($0) )" test.cpp

Matokeo husika:

#JUMUISHA #JUMUISHA #JUMUISHA JARIBIO UTUPU1(); INT TEST2(); // MAONI YA C-STYLE KWA MAIN() KAZI INT MAIN(INT ARGC, CHAR** ARGV) ( STD::COUT<< "HELLO, WORLD!" << STD::ENDL; FOR(INT I = 0; I < 10; ++I) { STD::COUT << I << STD::ENDL; } RETURN 0; } // КОММЕНТАРИЙ В СТИЛЕ С ДЛЯ ФУНКЦИИ TEST1() VOID TEST1() { STD::COUT << "HELLO, TEST1!" << STD::ENDL; } // КОММЕНТАРИЙ В СТИЛЕ С ДЛЯ ФУНКЦИИ TEST2() INT TEST2() { STD::COUT << "HELLO, TEST2!" << STD::ENDL; }

Masharti

Ikiwa-mwingine taarifa zinapatikana katika programu za awk. Kwa mfano, msimbo ufuatao huchapisha bila kubadilisha mistari ambayo ina int katika nafasi ya 1 na ( mwisho, vinginevyo --- inatumwa kwa kiweko:

Awk " ( if($1 == "int" && $NF == "() print; else print "---" )" test.cpp

Kuendesha nambari hutoa matokeo yafuatayo:

Int main(int argc, char** argv) ( --- --- --- --- --- --- --- --- --- --- --- --- -- --- --- int test2() (--- ---

Vigezo

Vigezo ambavyo havihitaji kutangazwa kwanza pia vinapatikana katika programu za awk. Msimbo ufuatao wa kuhesabu idadi ya mistari na maneno katika maandishi utawekwa kwenye faili ya stat.awk:

( lineCount++; wordCount += NF ) MWISHO ( printf "hesabu ya mstari: %d, hesabu ya maneno: %d\n", lineCount, wordCount )

Kisha inaitwa kama ifuatavyo:

Awk -f stat.awk test.cpp

Matokeo ya utekelezaji:

Idadi ya mistari: 27, hesabu ya maneno: 88

Kichujio cha END kinabainisha kuwa msimbo katika mabano baada yake unapaswa kutekelezwa baada ya mistari yote kupitiwa. Kichujio cha BEGIN kinapatikana pia kwa awk, kwa hivyo katika hali ya jumla zaidi programu inachukua fomu:

ANZA (Imepigiwa simu kabla ya kuanza kwa safu mlalo) (Imeitwa kwa kila safu mlalo baada ya sehemu ya BEGIN, lakini kabla ya sehemu ya END) END (Inaitwa baada ya safu mlalo kukamilika)

Wc -lw test.cpp

Mizunguko

Katika programu za awk, unaweza pia kufikia mtindo wa C kwa na wakati wa vitanzi. Kwa mfano, wacha tuchapishe mistari yote kwa mpangilio wa nyuma. Wacha tuunde faili reverse.awk na yaliyomo yafuatayo:

( kwa(i = NF; i > 0; --i) printf "%s ", $i; printf "\n" )

Wacha tuite programu kama ifuatavyo:

Awk -f reverse.awk test.cpp

Kama matokeo, maneno katika kila mstari yatachapishwa kwa mpangilio wa nyuma:

#pamoja na #pamoja na #jumuisha mtihani1(); mtihani batili2(); int main() kazi za mtindo wa C katika Maoni // () argv char** argc, int main(int std::endl;<< world!" "Hello, << std::cout {) ++i 10; < i 0; = i int for(std::endl; << i << std::cout } 0; return } test1() функции для С стиле в Комментарий // { test1() void std::endl; << test1!" "Hello, << std::cout } test2() функции для С стиле в Комментарий // { test2() int std::endl; << test2!" "Hello, << std::cout }

Kitenganishi cha maneno kisicho kawaida

Kwa chaguo-msingi, awk hutumia herufi za nafasi nyeupe kama vitenganishi vya maneno, lakini tabia hii inaweza kubadilishwa. Ili kufanya hivyo, tumia -F kubadili, ikifuatiwa na mstari unaofafanua kitenganishi. Kwa mfano, programu ifuatayo inaonyesha jina la kikundi na watumiaji wake (ikiwa kikundi kina watumiaji) kutoka kwa faili ya /etc/group, kwa kutumia herufi ya koloni kama kikomo:

Awk -F":" "( if($4) printf "%15s: %s\n", $1, $4 )" /etc/group

Kuchanganya Vichujio na Amri za Kuchapisha

Vichungi vyote vilivyojadiliwa hapo awali vinaweza kutumika kwa kushirikiana na amri za usindikaji wa kamba. Inatosha kuandika vikwazo kabla ya braces curly. Ifuatayo ni mfano wa kuchapisha mistari 9 ya kwanza ya matokeo ya amri ya ps, iliyo na habari kuhusu mtumiaji, kitambulisho cha mchakato na jina la amri:

Ps axu | sawa "NR< 10 { print $1, $2, $NF }"

Baada ya uzinduzi tutaona:

AMRI YA MTUMIAJI PID mzizi 1 /sbin/init mzizi 2 mzizi 3 mzizi 5 mzizi 7 mzizi 8 mzizi 9 mzizi 10

Katika makala hii, nina mpango wa kushiriki mifano muhimu ambayo inanisaidia kutatua matatizo ya kila siku na kurahisisha sana matumizi ya mstari wa amri. Kwa wale ambao bado hawajafahamu AWK, ninapendekeza kwamba hakika ujue lugha hii ya uandishi; hakuna chochote ngumu kuihusu. Ninapanga kuandamana na kila mfano na maoni madogo ambayo yanaangazia nuances ya kutumia waendeshaji fulani.
.

Tunatafuta mstari na parameter funga-anwani katika faili ya usanidi.

mzizi@debian:~# awk ‘/bind-anwani/’ /etc/mysql/my.cnf
funga-anwani = 127.0.0.1
funga-anwani = 192.168.1.110

Maelezo: AWK ina syntax na chaguzi zifuatazo.

awk[-f programu_faili | 'programu'] [-Fdelimiter]
[-v variable=value] [faili ...]

−F thamani - hufafanua kitenganishi (huweka thamani ya kutofautiana kwa FS iliyojengwa);
−f faili - maandishi ya programu yanasomwa kutoka kwa faili, badala ya mstari wa amri. Kusoma kutoka kwa faili nyingi kunasaidiwa;
−v var=value - kutoa thamani inayohitajika kwa kutofautiana;
−− - huashiria mwisho wa orodha ya chaguzi.

Mfano Nambari 2

Katika mfano hapo juu, utafutaji unafanywa katika faili, lakini AWK pia inaweza kukubali pato la amri nyingine. Wacha tujaribu kugumu mfano wetu ipasavyo.

mzizi@debian-wordpress:~# paka /etc/mysql/my.cnf | awk '/bind-anwani/'
funga-anwani = 127.0.0.1
funga-anwani = 192.168.1.110

Kama unaweza kuona, matokeo ya pato yalibaki sawa, ingawa muundo, kwa kweli, umekuwa mgumu zaidi. Ni lazima kusema kwamba katika mfano huu haifai kabisa kutumia chaguo la pili, kwa kuwa ni ngumu zaidi. Hebu jaribu kuzingatia hali nyingine ambapo matumizi ya kubuni vile itakuwa sahihi.

Mfano Nambari 3

Orodhesha viungo vya ishara na njia za faili lengwa.

mzizi@debian:~# ls -l /bin/ | awk ‘/lrwxrwxrwx/ ( chapa $9, $10, $11)’
bzcmp -> bzdiff
bzegrep -> bzgrep
bzfgrep -> bzgrep
bzless -> bzmore
lessfile -> lesspipe
lsmod -> kmod
mt -> /etc/alternatives/mt
nc -> /etc/alternatives/nc
netcat -> /etc/alternatives/netcat
fungua -> openvt
pidof -> /sbin/killall5
rbash -> bash
rnano -> nano
sh -> mstari
sh.distrib -> dashi

Maelezo: programu ya awk ni jozi ya kiolezo ( muundo) na vitendo ( (hatua)), pamoja na ufafanuzi wa kazi zilizoainishwa na mtumiaji. Kiolezo na hatua inaonekana kama hii: muundo (kitendo) Kiolezo au kitendo kinaweza kuachwa. Katika kesi ya kwanza, hatua itafanywa kwa kila mstari, kwa pili, pato la kawaida kwenye skrini litafanywa, sawa na amri.(chapisha). Maneno haya muhimu hayawezi kuunganishwa na mifumo mingine.

Mfuatano wa ingizo kwa kawaida huwa na sehemu zilizotenganishwa na nafasi nyeupe. (Mpangilio huu wa chaguo-msingi unaweza kubadilishwa kwa kutumia kibadilishaji kilichojengwa ndani FS au chaguzi -F delimiter.) Sehemu zimeteuliwa $1, $2, …; $0 inarejelea mstari mzima.

Mfano Nambari 4

Kulingana na maelezo hapo juu, hebu tuangalie mfano kwa kubadilisha kitenganishi chaguo-msingi - tazama orodha ya watumiaji wote bila maelezo ya ziada.

mzizi@debian:~# awk -F ":" '( chapisha $1)' /etc/passwd
mzizi
daemoni
bin
sys
kusawazisha
michezo
mtu

(Toleo la amri limefupishwa)

Maelezo: tangu kwenye faili /etc/passwd kumbukumbu zimehifadhiwa katika fomu " mzizi:x:0:0:mzizi:/mizizi:/bin/bash", ni busara kabisa kuchagua koloni kama kitenganishi na kuonyesha uwanja wa kwanza kabisa ( $1 ) kila mstari ( $0 ).

Mfano Nambari 5

Wote katika faili moja na watumiaji, unaweza kuhesabu idadi yao.

mzizi@debian:~# awk 'END ( chapisha NR )' /etc/passwd
25

Maelezo: Violezo maalum ANZA Na MWISHO inaweza kutumika kupata udhibiti kabla ya kusoma mstari wa kwanza wa ingizo na baada ya kusoma mstari wa mwisho wa ingizo, mtawalia.

Awk kimsingi ni mhariri wa mtiririko kama sed. Unaweza kuingiza maandishi kwenye programu hii na inaweza kuibadilisha mstari kwa mstari. Programu inaweza pia kusoma kutoka kwa faili. Awk pia ni lugha ya programu. Hii kimsingi inamaanisha kuwa awk inaweza kufanya kila kitu ambacho sed inaweza kufanya, na mengi zaidi.

Tofauti na sed, awk inaweza kukumbuka muktadha, kulinganisha, na mambo mengine mengi ambayo lugha zingine za programu zinaweza kufanya. Kwa mfano, sio mdogo kwa mstari mmoja. Kwa ustadi ufaao, inaweza KUUNGANISHA mistari mingi.

Njia rahisi zaidi ya awk inaonekana kama hii:

Awk "(hatua_fulani hapa)"

"Some_action_here" inaweza kuwa usemi wa kuchapisha matokeo, au kitu changamano zaidi. Syntax ni sawa na lugha ya programu ya "C". Mfano rahisi:

Awk "(chapisha $1,$3)"

ina maana ya kuchapisha safu ya kwanza na ya tatu, ambapo nguzo zinamaanisha "vitu vilivyotenganishwa na nafasi nyeupe". Nafasi nyeupe = kichupo au nafasi.

Mfano hai:

Mwangwi "1 2 3 4" | awk "(chapisha $1,$3)" 1 3

Sehemu ya Pili: AWK Inaweza Kufanya Nini?

Kusudi kuu la AWK maishani ni kudhibiti maoni yake kwa msingi wa mstari kwa mstari. Programu ya awk kawaida huendesha kwa mtindo

Ikiwa unachotaka kufanya hakiendani na mfano huu, basi awk inaweza kutoshea wazo lako.

Syntax ya kawaida inayotumiwa katika programu ya awk inaweza kuelezewa kama ifuatavyo:

Sampuli ya Awk (amri)

Ina maana kwamba

"Angalia kila mstari wa pembejeo ili kuona kama kuna PATTERN hapo. Ikiwa iko, endesha kilicho kati ()"

Unaweza kuruka SAMPLE au AMRI

Ikiwa hutabainisha muundo, amri itatumika kwa KILA mstari.

Ikiwa amri imeachwa, ni sawa na kusema (chapisha tu mstari):

(chapisha)

Mifano mahususi:

Awk "/#/ (chapisha "Kuna maoni kwenye mstari huu")" /etc/hosts

itachapisha "Mstari huu una maoni" kwa kila mstari ambao una angalau "#" mahali popote kwenye mstari ndani /etc/hosts

Marekebisho kwa uwazi

Awk "/#/ (chapisha $0 ":\tKuna maoni kwenye mstari huu)" /etc/hosts

Kipengele cha "//" katika muundo ni njia mojawapo ya kubainisha inayolingana. Pia kuna njia zingine za kuamua ikiwa kamba inalingana. Kwa mfano,

Awk "$1 == "#" (chapisha "mstari unaanza na heshi")" /etc/hosts

italingana na safu mlalo ambazo safu wima yake ya kwanza ni "#". Mfuatano wa vibambo "==" unamaanisha ULINGANIFU HALISI wa safu NZIMA ya kwanza.

Marekebisho ya uwazi:

Awk "$1 == "#" (chapisha $0 "\tline inaanza na heshi)" /etc/hosts

Kwa upande mwingine, ikiwa unataka mechi ya sehemu ya safu maalum, tumia opereta "~".

Awk "$1 ~ /#/ (chapisha "MAHALI kuna heshi kwenye safu ya 1")" /etc/hosts

KUMBUKA KWAMBA SAFU YA KWANZA INAWEZA KUWA BAADA YA NAFASI NYEUPE.

Marekebisho ya uwazi:

Awk "$1 ~ /#/ (chapisha $0 "\tKuna heshi MAHALI MAHALI kwenye safu wima ya 1)" /etc/hosts

Kuingiza "#maoni" kutalingana

Kuingiza "#maoni" PIA kutalingana

Ikiwa unataka mechi maalum ya "kamba inayoanza na # na nafasi" ungetumia

Awk "/^# / (fanya jambo)"

Mechi nyingi

Awk itachakata PATTERNS ZOTE zinazolingana na laini ya sasa. Kwa hivyo tukitumia mfano ufuatao,

Awk " /#/ (chapisha "Kuna maoni") $1 == "#" (chapisha "Toa maoni kwenye safu wima ya kwanza") /^# / (chapisha "Maoni mwanzoni kabisa") " /etc/hosts

Maingizo matatu yatatolewa kwa mstari kama ufuatao:

#Haya ni maoni

Ingizo mbili za

# Haya ni maoni yaliyoingizwa ndani

na moja tu kwa

1.2.3.4 jina la mwenyeji # maoni ya mwisho

Ufuatiliaji wa muktadha

Sio kamba zote zimeundwa sawa, hata ikiwa zinaonekana sawa. Wakati mwingine unataka kufanya kitu kwa kamba kulingana na mistari inayokuja mbele yake.

Huu hapa ni mfano wa haraka unaochapisha mistari "ADDR" ikiwa hauko katika sehemu ya "siri"

Awk " /secretstart/ ( siri=1) /ADDR/ ( ikiwa(siri==0) chapa $0 ) /* $0 ndio mstari kamili */ /secretend/ ( siri=0) "

Ifuatayo itachapisha yaliyomo ambayo yana "ADDR" ndani isipokuwa kamba "secretstart" ilionekana. AGIZA MAMBO. Kwa mfano, ikiwa utaiandika kama hii:

Awk " /ADDR/ ( ikiwa(siri==0) chapisha $0 ) /* $0 ndio mstari kamili */ /secretstart/ ( siri=1) /secretend/ ( siri=0) "

na toa maoni yafuatayo

ADDR kiongezeo cha kawaida kianzisha ADDR kiongeza siri ADDR kiongeza siri cha tatu ADDR weka ADDR kawaida pia

kisha "siri" addr ya kwanza itachapishwa. Kwa kuzingatia kwamba mfano wa asili utaficha siri zote mbili.

Sehemu ya Tatu: Vigezo Maalum

Tayari tumezungumza juu ya syntax ya kawaida ya awk. Sasa hebu tuanze kuangalia mambo ya mtindo.

awk ina kamba "maalum" zinazolingana: " ANZA"Na" MWISHO"

Maelekezo ANZA kuitwa mara moja kabla ya kusoma safu yoyote kutoka kwa data, kamwe tena.

Maelekezo MWISHO inaitwa baada ya mistari yote kusomwa. Ikiwa faili nyingi hutolewa, basi inaitwa tu baada ya faili ya hivi karibuni kukamilika.

Kwa kawaida utatumia ANZA kwa uanzishaji tofauti, na MWISHO kwa muhtasari au kusafisha.

ANZA ( maxerrors=3 ; logfile=/var/log/something ; tmpfile=/tmp/blah) ... ( blah blah blah ) /^header/ ( headercount += 1 ) END ( printf("jumla ya vichwa vimehesabiwa=% d\n", idadi ya vichwa);

Mfano huu utahesabu idadi ya mara "kichwa" kinaonekana kwenye faili ya uingizaji na kuchapisha jumla tu baada ya usindikaji wa faili nzima kukamilika.

AWK pia ina maadili mengine mengi maalum ambayo unaweza kutumia katika sehemu ya ( ). Kwa mfano,

Chapisha NF

itakupa jumla ya idadi ya safu wima (Idadi ya Sehemu) katika safu mlalo ya sasa. JINA LA FAILI litakuwa jina la faili la sasa, ikimaanisha kuwa jina la faili lilipitishwa kwa awk badala ya bomba kutumika.

HUWEZI KUBADILIKA NF peke yake.

Sawa na kutofautiana NR, ambayo inakuambia ni safu ngapi ambazo umechakata. ("Idadi ya Rekodi" - Idadi ya rekodi)

Kuna vigezo vingine maalum, hata ambavyo UNAWEZA kubadilisha katikati ya programu.

Sehemu ya Nne: Mifano Rahisi ya Awk

Ili kufafanua na kuimarisha kile ambacho kimesemwa, hebu tuangalie mifano michache maalum. Kwao tutahitaji faili tatu ndogo za maandishi.

Kwa mifano ifuatayo, hebu tuunde field_data.txt faili yenye maudhui yafuatayo:

Waridi ni nyekundu, Violets ni bluu, Sukari ni tamu, Na wewe pia.

Mwangwi -e "Mawaridi ni mekundu,\nViolets ni bluu,\nSukari ni tamu,\nNa wewe pia." >field_data.txt

Hebu tuunde faili letters.txt na maudhui yafuatayo

A bb ccc dddd ggg hh i

Kwenye mstari wa amri unaweza kufanya hivi:

Mwangwi -e "a\nbb\nccc\ndddd\nggg\nhh\ni" > letters.txt

Hatimaye, hebu tuunde faili ya data ya barua iliyo na maudhui yafuatayo:

Amelia 555-5553 [barua pepe imelindwa] F Anthony 555-3412 [barua pepe imelindwa] Becky 555-7685 [barua pepe imelindwa] Mswada wa 555-1675 [barua pepe imelindwa] A Broderick 555-0542 [barua pepe imelindwa] R Camilla 555-2912 [barua pepe imelindwa] R Fabius 555-1234 [barua pepe imelindwa] F Julie 555-6699 [barua pepe imelindwa] F Martin 555-6480 [barua pepe imelindwa] A Samweli 555-3430 [barua pepe imelindwa] Jean-Paul 555-2127 [barua pepe imelindwa] R

Hii inaweza kufanywa kwenye mstari wa amri kama hii:

Wget https://raw.githubusercontent.com/tdhopper/awk-lessons/master/data/mail-data -O mail-data

Mfano rahisi (sampuli)

Ikiwa tunahitaji mistari ndefu zaidi ya herufi mbili na tunataka kutumia kitendo chaguo-msingi ( chapa), kisha tunapata:

Awk "urefu $0 > 2" herufi.txt bb ccc dddd ggg hh

$0 ni kigezo kilichojengwa ndani ambacho kina kamba.

Kazi rahisi

Ikiwa hatutaja muundo, basi kila mstari utafanana. Kitendo kidogo kitakuwa kuchapisha kila mstari:

Awk "( chapa)" herufi.txt a bb ccc dddd ggg hh i

Kwa kutumia kipengele urefu kama hatua yetu, tunaweza kupata urefu wa kila mstari:

Awk "( urefu wa chapa)" herufi.txt 1 2 3 4 3 2 1

Kitendo hiki kinatumika bila masharti kwa safu mlalo yote. Tunaweza pia kubainisha hili kwa uwazi:

Awk "( urefu chapa $0)" herufi.txt 1a 2bb 3ccc 4dddd 3ggg 2hh 1i

Awk ina vidhibiti maalum vya kutekeleza nambari fulani kabla ya kuingiza faili kuanza na baada ya kukamilika kwa faili.

Awk "BEGIN ( chapisha "HI" ) ( chapisha $0 ) MWISHO ( chapisha "BYE!" )" herufi.txt HI a bb ccc dddd ggg hh i BYE!

Tunaweza kuwa nayo vipengele zaidi kudhibiti wakati wa uchapishaji kwa kutumia chapa.

Awk "ANZA ( printf "%-10s %s\n", "Jina", "Nambari" \ printf "%-10s %s\n", "----", "------" ) \ ( printf "%-10s %s\n", $1, $2 )" mail-data Name Number ---- ------ Amelia 555-5553 Anthony 555-3412 Becky 555-7685 Bill 555-1675 Broderick 555-0542 Camilla 555-2912 Fabius 555-1234 Julie 555-6699 Martin 555-6480 Samweli 555-3430 Jean-Paul 555-2127

Kuchanganya sampuli na kazi

Bila shaka, mifumo na kazi zinaweza kuunganishwa ili kazi itatumika tu ikiwa kamba inafanana na muundo.

Tunaweza kuchapisha urefu wa mistari yote zaidi ya herufi 2.

Awk "urefu($0) > 2 ( chapa urefu($0) )" herufi.txt 3 4 3

Kwa kweli, sio lazima tuweke kikomo Awk kwa muundo mmoja tu! Tunaweza kuwa na idadi kiholela ya ruwaza, ikitenganishwa na nusukoloni au mistari mipya:

Awk "length($0) > 2 ( chapisha "Long: " length($0) ); urefu($0)< 2 { print "Short: " length($0) }" letters.txt Short: 1 Long: 3 Long: 4 Long: 3 Short: 1

Mashamba mengi

Awk imeundwa kwa usindikaji rahisi wa data na sehemu nyingi mfululizo. Kitenganishi cha shamba kinaweza kubainishwa na ufunguo -F.

Mfano wa faili ambapo delimiter ni nafasi:

Awk "( chapa)" field_data.txt Waridi ni nyekundu, Violets ni bluu, Sukari ni tamu, Na wewe pia.

Ikiwa tutabainisha kitenganishi cha shamba, tunaweza kuchapisha sehemu ya pili ya kila mstari:

Awk -F " " "( chapisha $2 )" field_data.txt are are ni hivyo

Hatutapata hitilafu ikiwa safu mlalo haina uga unaolingana; tutaonyeshwa tu mstari tupu:

Awk -F " " "( chapisha $4 )" field_data.txt you.

Kwa kuwa kitenganishi chaguo-msingi ni nafasi, amri ya awali ingetoa matokeo sawa bila kutumia chaguo -F. Kwa mfano wa maana zaidi, wacha tuunde faili nyingine viwango.txt na maudhui yafuatayo:

Pilcrow,Humphrey,3 Pilcrow,Zora,1 Plinius,Oldone,4 Razniecki,Anton,7 Russell,Bertrand,0

Sasa tunaonyesha kama kitenganishi , (comma) na uonyeshe yaliyomo kwenye safu ya pili:

Awk -F "," "( chapisha $2)" viwango.txt Humphrey Zora Oldone Anton Bertrand

Usemi wa kikomo hufasiriwa kama usemi wa kawaida.

Awk -F "((so)?are|is) " "(chapisha "Sehemu ya 1: " $1 "\nSehemu ya 2: " $2)" field_data.txt Sehemu ya 1: Sehemu ya 2 ya Waridi: nyekundu, Sehemu ya 1: Sehemu ya 2 ya Violets : bluu, Shamba 1: Shamba la Sukari 2: tamu, Shamba 1: Na Shamba 2: wewe.

Maneno ya Kawaida

Sampuli zinaweza kuwa misemo ya kawaida, sio tu vitendaji vilivyojengwa ndani.

Tunaweza kutumia misemo ya kawaida kupata maneno yote katika ulimwengu wa Unix yenye vokali 5 mfululizo.

Awk "/(5)/" /usr/share/dict/maneno cadiueio Chaouia euouae Guauaenok

Kupitisha Vigezo kwa Programu

Chaguo -v kwa Awk huturuhusu kupitisha vigeu kwenye programu. Kwa mfano, tunaweza kutumia hii kwa vidhibiti vya nambari ngumu.

Awk -v pi=3.1415 "ANZA ( chapa pi )" 3.1415

Tunaweza pia kutumia -v kupitisha anuwai za Bash kama anuwai za Awk

Awk -v user=$USER "BEGIN (chapisha mtumiaji)" mial

Ikiwa-mwingine misemo

Ikiwa-mwingine misemo katika Awk inaonekana kama:

Ikiwa (hali) mwili-basi

Kwa mfano:

Chapisha "1\n2\n3\n4" | awk \ "( \ ikiwa ($1 % 2 == 0) chapisha $1, "ni sawa"; \\ else chapisha $1, "ni isiyo ya kawaida" \)" 1 ni isiyo ya kawaida 2 hata 3 ni isiyo ya kawaida 4 ni sawa

Mizunguko

Awk inajumuisha misemo kadhaa ya kitanzi: wakati, fanya wakati Na kwa.

Wana syntax ya C inayotarajiwa.

Awk\"BEGIN(\i=0;\wakati(i< 5) { print i; i+=1; } \ }" 0 1 2 3 4 awk \ "BEGIN { \ i = 0; \ do { print i; i+=1; } while(i < 0) \ }" 0 awk \ "BEGIN { \ i = 0; \ for(i = 0; i<5; i++) print i \ }" 0 1 2 3 4

kwa inaweza pia kufafanua kitanzi kupitia funguo za safu, ambayo itajadiliwa baadaye.

Sehemu ya Tano: Kazi za Kupiga simu

Sehemu inayofuata ya AWK ni kazi zake zote maalum za kujengwa.

AWK ina vipengele ambavyo vitafanya kipanga programu wastani cha C kuwa na furaha kabisa. Hapa kuna vitu kama vile sin()/cos()/tan(), rand(),index(), sprintf(), tolower(), system()

Kazi zimepangwa kwa vikundi na zinaweza kutazamwa kama ifuatavyo:

Hisabati

+, -, /, *, sin(), cos(), tan(), atan(), sqrt(), rand(), srand()

Wanazungumza wenyewe, angalau ningependa kufikiria hivyo.

Awk -v pi=3.1415 "ANZA ( chapisha exp(1), log(exp(1)), sqrt(2), sin(pi), cos(pi), atan2(pi, 2))" 2.71828 1 1.41421 9.26536 e-05 -1 1.00387

Programu inaweza kutoa nambari isiyo ya kawaida katika safu (0, 1).

Kwa chaguo-msingi, Awk huanza kutoka mwanzo sawa (mbegu) kwa Awk. Kuendesha amri hii mara mbili mfululizo kutarudisha matokeo sawa:

Awk "BEGIN ( chapa rand(); chapisha rand() )" 0.237788 0.291066

Kuweka kuanza (mbegu) unaweza kutumia kazi ya srand:

Awk "BEGIN ( srand(10); chapisha rand(); chapisha rand())" 0.255219 0.898883 awk "BEGIN ( srand(10); chapisha rand(); chapisha rand())" 0.255219 0.898883

Kazi int hurejesha "nambari kamili ya karibu zaidi hadi x kati ya x na sifuri, na sifuri inayoongoza kutupwa."

Awk "ANZA ( chapisha "int(0.9) = " int(0.9); chapisha "int(-0.9) = " int(-0.9) )" int(0.9) = 0 int(-0.9) = 0

Udanganyifu wa kamba

  • index() itakuambia ikiwa, na ikiwa ni hivyo wapi, kamba inatokea ndani ya kamba ndogo.
  • mechi() sawa, lakini hufanya kazi kwa misemo ya kawaida.
  • sprintf() hukupa njia za kufomati matokeo na kufanya ubadilishaji njiani. Hii inapaswa kujulikana kwa mtu yeyote ambaye ametumia printf() na C. Kwa mfano,
newstring=sprintf("moja ni nambari %d, mbili ni kamba %s\n", moja, mbili); chapisha kamba mpya

"%d" anasema "chapisha thamani inayolingana nami kama nambari ya desimali"
"%s" anasema "chapisha thamani inayolingana nami kama kamba"

Wale. ikiwa unataka kubatilisha mistari miwili bila mapumziko, NJIA MOJA itakuwa kutumia

Newstring=sprintf("%s%s", moja, mbili)

  • urefu () inakupa tu njia rahisi ya kuhesabu idadi ya wahusika kwenye mstari ikiwa unahitaji.

Kazi sehemu ndogo, m, n) itarudisha kamba ndogo ndani n-wahusika kuanzia nafasi m, imehesabiwa kutoka 1.

Awk "( chapisha $1, substr($1, 2, 3))" field_data.txt Roses ose Violets iol Sukari uga Na nd

index(s, t) inarudisha `nafasi ndani s ambayo mstari hutokea t, au 0 ikiwa haitatokea.`

Mchoro wa faharasa si usemi wa kawaida.

Awk "( chapisha $1, index($1, "s"))" field_data.txt Roses 3 Violets 7 Sukari 0 Na 0

mechi (vi, r) inarudisha nafasi ndani s ambamo usemi wa kawaida hutokea r, au 0 ikiwa haitatokea. Vigezo ANZA UPYA Na UREFU zimewekwa kwa nafasi na urefu wa kamba inayofanana.

mechi- Hiyo ni jinsi gani index isipokuwa kwamba muundo ni usemi wa kawaida.

Awk "( chapisha $1, mechi($1, ""))" field_data.txt Roses 3 Violets 7 Sukari 1 Na 0 # "Tafuta herufi tatu au zaidi zinazojirudia" awk "( mechi($1, "(3)"); chapisha $1, "\tpattern anza:", RSTART, "\tpattern end:", RLENGTH )" herufi.txt mwanzo wa mchoro: mwisho wa muundo 0: -1 mwanzo wa muundo wa bb: mwisho wa muundo 0: -1 mchoro wa ccc mwanzo: muundo 1 mwisho: 3 mchoro wa dddd mwanzo: 1 muundo mwisho: 3 ggg muundo kuanza: 1 muundo mwisho: 3 hh muundo kuanza: 0 mwisho wa muundo: -1 i mwanzo wa muundo: 0 mwisho wa muundo: -1

mgawanyiko, a, fs hugawanya kamba katika safu ya vipengele a, a, ..., a, na inarudi n.

Mgawanyiko unafanywa kwa kujieleza mara kwa mara fs au na kitenganishi cha shamba FS, Kama fs haijatolewa. Mfuatano tupu kama kitenganishi cha uga hugawanya kamba katika safu ya vipengele herufi kwa herufi.

Awk "BEGIN ( print split("It- was_the-best_of-times", output_array, "[-_]"), output_array, output_array)" 6 ilikuwa bora zaidi

ndogo (r, t, s) inachukua nafasi na t tukio la kwanza la kujieleza mara kwa mara r katika mstari s. Ikiwa s haijatolewa, basi tumia $0

s ni kamba ambapo uingizwaji hutokea. Badala ya kurudisha mfuatano mpya na kibadilisho kilichofanywa, nambari ya uingizwaji (0 au 1) itarejeshwa.

Awk "BEGIN ( s = "Ilikuwa nyakati bora zaidi, ilikuwa nyakati mbaya zaidi"; \ chapisha "Num. mechi zilibadilishwa:", sub("nyakati", "gifs", s); \ print s )" Hesabu. mechi kubadilishwa: 1 Ilikuwa gifs bora zaidi, ilikuwa nyakati mbaya zaidi

gsub hufanya kitu sawa na ndogo isipokuwa kwamba matukio yote ya usemi wa kawaida yanabadilishwa; ndogo Na gsub kurudisha idadi ya uingizwaji.

Awk "BEGIN ( s = "Ilikuwa nyakati bora zaidi, ilikuwa nyakati mbaya zaidi"; \ chapisha "Num. mechi zilibadilishwa:", gsub("nyakati", "paka", s); \ print s )" Hesabu. mechi zilizobadilishwa: 2 Ilikuwa paka bora zaidi, ilikuwa paka mbaya zaidi sprintf sprintf(fmt, expr, ...) inarudisha kamba iliyotokana na umbizo la expr ... kulingana na umbizo la printf(3) fmt awk "BEGIN ( x = sprintf("[%8.3f]", 3.141592654); chapa x)" [3.142]

Kazi za kiwango cha mfumo

mfumo() hukuruhusu kupiga simu inayoweza kutekelezwa faili YOYOTE kwenye mfumo. Programu inayolengwa inaweza kuwa ndani yako $PATH, au unaweza kuibainisha kwa kutumia njia kabisa.

Kwa mfano, inatisha

Mfumo ("rm -rf $HOME");

Mfumo("/bin/kuua 1")

Ikiwa unataka kufanya mambo magumu zaidi labda utaishia kufanya kitu kama hicho

Sysstring=sprintf("somecommand %s %s", arg1, arg2); mfumo (mfumo)

funga () ni kipengele muhimu ambacho mara nyingi hupuuzwa. Labda hii ni kwa sababu hakuna simu dhahiri fungua (), ndiyo maana watu hawafikirii kuhusu changamoto funga (). Na kwa madhumuni mengi hii sio lazima. Lakini LAZIMA UFANYE HIVI ikiwa unashughulika na faili zaidi ya moja ya towe.

Awk inakupa uwezo wa kufungua faili kiholela kwenye kuruka. Kwa mfano

/^faili/ ( chapisha $3 >> $2)

inapaswa kuchukua mstari "matokeo ya faili hapa-ni-neno", fungua faili "pato" na uchapishe "hapa-ni-neno" ndani yake.

AWK ni "smart" kwa kuwa inafuatilia ni faili gani unafungua na HUZIWEKA wazi. Inadhania ikiwa ulifungua faili mara moja, labda utafanya tena. Kwa bahati mbaya, hii inamaanisha kuwa ukifungua faili nyingi, unaweza kukosa maelezo ya faili. Kwa hivyo unapojua kuwa umemaliza na faili, ifunge. Kwa hivyo ili kuboresha mfano hapo juu, unapaswa kutumia kitu kama mistari ifuatayo:

/^file/ (ikiwa ($2 != oldfile) ( close(oldfile)); chapisha $3 >> $2 ; oldfile = $2; )

Sehemu ya Sita: Safu

Dhana ya safu

Tayari tumeangalia viambishi kama majina ambayo yana thamani. Safu ni ugani wa vigezo. Safu ni vigeu vilivyo na thamani zaidi ya moja. Zinaweza kuwa na thamani zaidi ya moja kwa sababu kila thamani ina nambari yake.

Ikiwa unahitaji kuwa na maadili matatu, unaweza kusema:

Thamani1="moja"; thamani2="mbili"; thamani3="tatu";

AU, unaweza kutumia

Maadili = "moja"; maadili="mbili"; maadili="tatu";

Mfano wa kwanza ni vigezo vitatu tofauti na majina yao wenyewe (ambayo hutofautiana na tabia moja). Mfano wa pili ni safu ambayo ina tofauti moja, lakini ina maadili mengi, ambayo kila moja ina nambari yake.

Unapotumia kigezo kama safu, lazima uambatanishe thamani kila wakati katika mabano ya mraba. Unaweza kuchagua jina lolote kwa safu tofauti, lakini kuanzia sasa na kuendelea jina hilo linaweza kutumika kwa safu TU. HUWEZI kufanya lolote la maana

Maadili = "moja"; values="thamani mpya";

Walakini, UNAWEZA kupeana tena maadili kama vile ungefanya kwa anuwai za kawaida. Wale. yafuatayo NI sahihi:

Thamani="1"; maadili ya kuchapisha; maadili="moja"; maadili ya kuchapisha;

Jambo la kufurahisha ni kwamba, tofauti na lugha zingine, haulazimishwi kutumia nambari tu. Katika mifano iliyo hapo juu, ,, imefasiriwa kama [“1”], [“2”], [“3”]. Inayomaanisha kuwa unaweza pia kutumia kamba zingine kama vitambulisho, na kutibu safu kama hifadhidata ya safu wima moja. Jina rasmi la hii ni "safu inayohusishwa".

Nambari["moja"]=1; nambari["mbili"]=2; chapisha nambari["moja"]; thamani="mbili"; print numbers; value=$1; if(numbers = ""){ print "no such number"; } !}

Wakati na jinsi ya kutumia safu

Kunaweza kuwa na matukio mbalimbali ambapo unaweza kuchagua kutumia safu. Watu wengine, wakati wa kufanya kazi na awk, fanya bila safu hata kidogo. Lakini hii sio nafasi sahihi kabisa: kwa safu kuna anuwai maalum ambazo, kwa mfano, zinaonyesha saizi yake (idadi ya maadili kwenye safu), kuna muundo unaofaa kwa kuorodhesha washiriki wa safu, na kazi zingine zinarudisha thamani. kwa namna ya safu. Hata hivyo, wacha tuangalie mifano ambayo inaweza kuja kwa manufaa.

Kuhifadhi habari kwa matumizi ya baadaye

Unapotumia awk kwenye hati kubwa ya ganda, unaweza kuhifadhi habari kwenye faili ya muda. Lakini unaweza kuhifadhi maneno unayohitaji kwenye kumbukumbu na kisha kuyachapisha yote mwishoni, ambayo yatakuwa haraka kuliko kutumia faili ya muda.

/special/( savedwords=$2; lnum+=1; ) MWISHO ( count=0; while(savedwords != "") ( hesabu chapa, maneno yaliyohifadhiwa; count+=1; ) )

Badala ya kuonyesha maneno tu, unaweza kutumia sehemu ya END kufanya uchakataji wowote wa ziada unaoweza kuhitaji kabla ya kuyaonyesha.

Ikiwa unataka kugawa faharisi ya kipekee kwa maadili (ili kuzuia nakala), kwa ujumla unaweza kurejelea maadili yao kwa safu mlalo zao. Au, kwa mfano, hifadhi safu iliyo na safu wima ya 3, iliyoorodheshwa na thamani inayolingana katika safu wima ya 2.

( threecol[$2]=$3 ) MWISHO ( kwa (v in threecol) ( print v, threecol[v] ) )

Safu na mgawanyiko()

Sababu nyingine kuu ya kutumia safu ni ikiwa unataka kufanya sehemu ndogo. Wacha tuseme una safu ambayo ina mgawanyiko kadhaa mkubwa na mgawanyiko kadhaa mdogo. Kwa maneno mengine, sehemu za kiwango cha juu zimetenganishwa na nafasi, lakini kisha unapata maneno madogo yaliyotenganishwa na koloni.

Hii ni tofauti:uga:aina ya mstari Kunaweza kuwa na anuwai:aina:maadili hapa

Katika mfano hapo juu, uwanja wa nne, uliotenganishwa na nafasi, una uwanja mdogo uliotengwa na koloni. Sasa, tuseme unataka kujua thamani ya uwanja mdogo wa pili katika uga mkubwa wa nne. Njia moja ya kufanya hivyo ni kupiga simu awks mbili zilizounganishwa na bomba:

Awk "(chapisha $4)" | awk -F: "(chapisha $2)"

Njia nyingine itakuwa kubadilisha thamani ya "FS" kwenye nzi, ambayo ina kitenganishi cha shamba (dhahiri hii haifanyi kazi na utekelezaji wote wa awk):

Awk "( newline=$4; fs=FS; FS=":"; $0=linewline; chapisha $2 ; FS=fs; )"

Lakini pia unaweza kufanya hivyo na safu kwa kutumia split() kazi kama hii:

Awk "( newline=$4; split(linewline, subfields):"); chapisha sehemu ndogo) "

Katika kesi hii, kutumia safu ndiyo njia ya kawaida na labda ya kifahari zaidi ya kuifanya.

Kwa hivyo, Awk hutoa idadi ndogo ya miundo ya data. Kando na viambajengo vya scalar na kamba, lugha ina muundo mkubwa wa data uliojengewa ndani. Ingawa inaitwa rasmi "safu", muundo huu kwa kweli ni safu inayohusishwa, sawa na muundo wa data ya dict katika Python.

Safu hazihitaji kuanzishwa. Unaweza tu kuanza kugawa maadili. Kumbuka kwamba funguo zinaweza kuwa nambari au kamba.

Awk "BEGIN ( \ a = 1.1; \ a = 0; \ a["MBWA"] = "PAKA"; \ chapisha a, a, a["MBWA"] \)" 1.1 0 PAKA

Awk haitachapisha kutofautisha bila faharisi:

Awk "BEGIN ( \a["MBWA"] = "CAT"; \print a\ )" awk: cmd. mstari:3: mbaya: jaribu kutumia safu `a" katika muktadha wa kozi

Ingawa tunaweza kuzunguka kwa kutumia ufunguo kwa:

Awk "ANZA ( \ a = 1.1; \ a = 0; \ a["MBWA"] = "CAT"; \ kwa(k katika a) chapa(a[k]) \ )" PAKA 0 1.1

Sehemu ya Saba: AWK na Shells (sh/ksh/bash/csh)

Wakati mwingine utendaji wa AWK unaweza kuwa hautoshi. Katika kesi hii, unaweza kujumuisha awk kwenye hati yako ya ganda. Ifuatayo ni baadhi ya mifano ya jinsi hii inaweza kufanywa.

Hitimisho rahisi

Wakati mwingine unataka kutumia awk kama kiumbizaji, na utupe pato moja kwa moja kwa mtumiaji. Hati ifuatayo inachukua jina la mtumiaji kama hoja na hutumia awk kutupa taarifa ya mtumiaji kutoka /etc/passwd.

Kumbuka: Kumbuka kuwa kwenye hati nukuu moja zimepanuliwa (hazijawekwa kiota) na kati ya jozi mbili zilizopanuliwa za nukuu moja kuna tofauti $1 (ya pili), ambayo katika kesi hii ni hoja ya hati, wakati $1 ni sehemu ya syntax. $1 (inamaanisha sehemu ya kwanza kwenye mstari).

#!/bin/sh huku [ "$1" != "" ] ; fanya awk -F: "$1 == ""$1"" ( chapisha $1,$3) " /etc/passwd shift done

Inakabidhi vigeu vya ganda la pato la awk

Wakati mwingine tunataka kutumia awk kwa njia ya haraka ya kuweka thamani ya kutofautisha. Kutumia mandhari ya passwd, tunayo njia ya kujua ganda la mtumiaji na kuona ikiwa iko kwenye orodha ya makombora rasmi.

Tena, angalia jinsi nukuu moja zinavyofungwa katika usemi wa awk. Baada ya nukuu iliyofungwa (ya pili), $1 ni kigezo ambacho hupitishwa thamani ya hoja ya kwanza kwa hati, si sehemu ya sintaksia ya awk.

#!/bin/sh user="$1" ikiwa [ "$user" == "" ] ; kisha echo ERROR: hitaji jina la mtumiaji; Utgång ; fi usershell=`awk -F: "$1 == ""$1"" ( chapisha $7) " /etc/passwd` grep -l $usershell /etc/shells if [ $? -ne 0] ; kisha echo ERROR: shell $usershell kwa mtumiaji $user si katika /etc/shells fi

Njia mbadala zingine:

# Tazama "man regex" usershell=`awk -F: "/^"$1":/ ( chapisha $7) " /etc/passwd` echo $usershell; # Awk ya kisasa pekee inakubali -v. Huenda ukahitaji kutumia "nawk" au "gawk" usershell2=`awk -F: -v user=$1 "$1 == mtumiaji ( chapa $7) " /etc/passwd` echo $usershell2;

Kuelezea njia za ziada hapo juu huachwa kama kazi ya nyumbani kwa msomaji :)

Inahamisha data kwa awk kupitia bomba

Wakati mwingine unataka kuweka awk kama kichujio cha data, katika programu kubwa, au kama amri ya mstari mmoja iliyoingizwa kwenye haraka ya shell. Mfano wa amri kama hiyo kwenye hati (orodha ya faili za kumbukumbu za seva ya wavuti hupitishwa kama hoja kwa hati, kwani ukataji miti unaweza kubinafsishwa na kumbukumbu zinaweza kuwa na muundo tofauti; ili ifanye kazi katika hali maalum, inaweza kuwa muhimu kurekebisha amri):

#!/bin/sh grep -h " /index.html" $* | awk -F\" "(chapisha $4)" | panga -u

  1. Makala ya kuvutia, nataka kukushukuru kwa jitihada zako.

    Niliona kuwa si sahihi. Ikiwa utafanya mstari kutoka kwa mfano

    Awk -F " " "( chapisha $2 )" field_data.txt

    itatoa kitu sawa na

    Awk "( chapisha $2)" field_data.txt

    Matokeo yake ni mfano na -F haijaelezewa vizuri.