BASH៖ ប្រើកម្មវិធីបកប្រែ awk ។ ការជ្រើសរើសជួរពីជួរដែលបានផ្តល់ឱ្យ។ កន្សោមនិងប្លុក

ការណែនាំអំពីភាសាដ៏អស្ចារ្យមួយដែលមានឈ្មោះចម្លែក

Daniel Robbins ប្រធាន/CEO, Gentoo Technologies, Inc.

ការពិពណ៌នា: Awk គឺជាភាសាដ៏អស្ចារ្យមួយដែលមានឈ្មោះចម្លែកណាស់។ នៅក្នុងអត្ថបទដំបូងនៃស៊េរីបីផ្នែកនេះ Daniel Robbins ផ្តល់ឱ្យ ការណែនាំខ្លីៗនៅក្នុងមូលដ្ឋាននៃការសរសេរកម្មវិធីនៅក្នុង awk ។ អត្ថបទនាពេលអនាគតនៅក្នុងស៊េរីនឹងគ្របដណ្តប់លើប្រធានបទកម្រិតខ្ពស់បន្ថែមទៀត ដែលឈានដល់ការបង្កើតកម្មវិធីសាកល្បង awk ជីវិតពិតដ៏ធ្ងន់ធ្ងរ។

អត្ថបទនេះដាក់ស្លាក៖ awk

ដាក់ទង់នេះ!

កាលបរិច្ឆេទ៖ 01/29/2009

កម្រិតលំបាក៖ ងាយស្រួល

មតិយោបល់៖ 0 (មើល | បន្ថែមមតិយោបល់ - ចូល)

វាយតម្លៃអត្ថបទនេះ។

ដើម្បីការពារអាក

នៅក្នុងស៊េរីនៃអត្ថបទនេះ ខ្ញុំនឹងធ្វើឱ្យអ្នកអានក្លាយជាអ្នកសរសេរកម្មវិធី awk ដែលមានជំនាញ។ ខ្ញុំយល់ស្របថា awk មិនមានឈ្មោះល្អ ឬពេញនិយមបំផុតនោះទេ ហើយកំណែ GNU នៃ awk ដែលហៅថា gawk ស្តាប់ទៅដូចជាចំលែកណាស់។ អ្នកសរសេរកម្មវិធីដែលមិនស៊ាំនឹងភាសានេះ ឮឈ្មោះរបស់វា អាចស្រមៃមើលកូដបុរាណ និងហួសសម័យ ដែលអាចជំរុញឱ្យឆ្កួតបំផុត។ អ្នកឯកទេសដែលមានចំណេះដឹងលើយូនីក (ធ្វើឱ្យគាត់លាន់មាត់ថា "សម្លាប់ -៩!" ហើយរត់រកកាហ្វេឥតឈប់ឈរ) ។

បាទ, awk មិន ឈ្មោះដ៏អស្ចារ្យ. ប៉ុន្តែវាជាភាសាដ៏អស្ចារ្យ។ Awk ត្រូវ​បាន​រចនា​ឡើង​សម្រាប់​ដំណើរការ​អត្ថបទ និង​ការ​រាយការណ៍ ប៉ុន្តែ​វា​មាន​លក្ខណៈ​ពិសេស​ដែល​ត្រូវ​បាន​បង្កើត​ឡើង​យ៉ាង​ល្អ​ដែល​បើក​ដំណើរការ​កម្មវិធី​ធ្ងន់ធ្ងរ។ ទោះយ៉ាងណាក៏ដោយ មិនដូចភាសាផ្សេងទៀតទេ វាក្យសម្ព័ន្ធរបស់ awk គឺស៊ាំ និងខ្ចីបានល្អបំផុតពីភាសាដូចជា C, python និង bash (ទោះបីជា awk ត្រូវបានបង្កើតជាផ្លូវការមុន python និង bash)។ Awk គឺជាភាសាមួយក្នុងចំនោមភាសាទាំងនោះដែលនៅពេលរៀនម្តង ក្លាយជាផ្នែកសំខាន់នៃឃ្លាំងយុទ្ធសាស្ត្ររបស់អ្នកសរសេរកម្មវិធី។

ជំហានដំបូងនៅក្នុង awk

តោះចាប់ផ្តើម ហើយសាកល្បងសាកល្បងជាមួយ awk ដើម្បីមើលពីរបៀបដែលវាដំណើរការ។ នៅបន្ទាត់ពាក្យបញ្ជា បញ្ចូលពាក្យបញ្ជាខាងក្រោម៖ $ awk "( print )" /etc/passwd

លទ្ធផលគួរតែបង្ហាញមាតិកានៃឯកសារ /etc/passwd ។ ឥឡូវនេះ - ការពន្យល់អំពីអ្វីដែល awk បានធ្វើ។ នៅពេលហៅ awk យើងបានបញ្ជាក់ /etc/passwd ជាឯកសារបញ្ចូល។ នៅពេលដែលយើងដំណើរការ awk វាដំណើរការពាក្យបញ្ជាបោះពុម្ពសម្រាប់បន្ទាត់នីមួយៗក្នុង /etc/passwd តាមលំដាប់លំដោយ។ លទ្ធផលទាំងអស់ត្រូវបានបញ្ជូនទៅ stdout ហើយយើងទទួលបានលទ្ធផលដូចគ្នាទៅនឹងលទ្ធផល ពាក្យបញ្ជាឆ្មា/etc/passwd. ឥឡូវ​សូម​ពន្យល់​ពី​ប្លុក (បោះពុម្ព)។ នៅក្នុង awk ដង្កៀបត្រូវ​បាន​ប្រើ​ដើម្បី​ដាក់​ជា​ក្រុម​ប្លុក​អត្ថបទ​ដូច​ជា​នៅ​ក្នុង C. ប្លុក​អត្ថបទ​របស់​យើង​មាន​ពាក្យ​បញ្ជា​បោះពុម្ព​តែ​មួយ​ប៉ុណ្ណោះ។ នៅក្នុង awk ពាក្យបញ្ជាបោះពុម្ពគឺដោយគ្មាន ប៉ារ៉ាម៉ែត្របន្ថែមបោះពុម្ពមាតិកាទាំងអស់។ បន្ទាត់បច្ចុប្បន្ន.

នេះជាឧទាហរណ៍មួយទៀតនៃកម្មវិធី awk ដែលធ្វើដូចគ្នា៖ $ awk "( print $0 )" /etc/passwd

ជាអកុសល អថេរ $0 តំណាងឱ្យបន្ទាត់បច្ចុប្បន្នទាំងមូល ដូច្នេះការបោះពុម្ព និងបោះពុម្ព $0 ធ្វើដូចគ្នាទាំងស្រុង។ ប្រសិនបើអ្នកចូលចិត្ត អ្នកអាចបង្កើតកម្មវិធីមួយក្នុង awk ដែលនឹងបញ្ចេញទិន្នន័យដែលមិនទាក់ទងទាំងស្រុងទៅនឹងទិន្នន័យបញ្ចូល។ នេះជាឧទាហរណ៍៖ $ awk "( print "" )" /etc/passwd

នៅពេលអ្នកបញ្ជូនខ្សែអក្សរ "" ទៅពាក្យបញ្ជាបោះពុម្ព វាតែងតែបោះពុម្ពខ្សែអក្សរទទេ។ ប្រសិនបើអ្នកសាកល្បងស្គ្រីបនេះ អ្នកនឹងឃើញថា awk ចេញបន្ទាត់ទទេមួយក្នុងមួយជួរក្នុង /etc/passwd ។ វាកើតឡើងម្តងទៀតដោយសារតែ awk ប្រតិបត្តិស្គ្រីបសម្រាប់បន្ទាត់នីមួយៗនៅក្នុងឯកសារបញ្ចូល។ នេះជាឧទាហរណ៍មួយទៀត៖ $ awk "( print "hiya" )" /etc/passwd

ប្រសិនបើអ្នកដំណើរការស្គ្រីបនេះ វានឹងបំពេញអេក្រង់ដោយពាក្យ "ចាស"។ :)

វាលច្រើន។

Awk គឺស័ក្តិសមសម្រាប់ដំណើរការអត្ថបទដែលត្រូវបានបំបែកទៅជាវាលឡូជីខលច្រើន ហើយធ្វើឱ្យវាងាយស្រួលក្នុងការចូលប្រើវាលនីមួយៗពីក្នុងស្គ្រីប awk។ ស្គ្រីបខាងក្រោមនឹងបោះពុម្ពបញ្ជីគណនីទាំងអស់នៅលើប្រព័ន្ធ៖ $ /etc/passwd

នៅក្នុងការហៅ awk ក្នុងឧទាហរណ៍ខាងលើ ជម្រើស –F បញ្ជាក់ ":" ជាសញ្ញាបំបែកវាល។ នៅពេលដំណើរការពាក្យបញ្ជា print $1, awk បោះពុម្ពវាលដំបូងដែលបានជួបប្រទះនៅលើបន្ទាត់នីមួយៗនៃឯកសារបញ្ចូល។ នេះជាឧទាហរណ៍មួយទៀត៖ $ awk -F":" "(បោះពុម្ព $1 $3)" /etc/passwd

នេះគឺជាបំណែកពីលទ្ធផលអេក្រង់នៃស្គ្រីបនេះ៖ halt7

ដូចដែលអ្នកអាចឃើញ awk បញ្ចេញវាលទីមួយ និងទីបីនៃឯកសារ /etc/passwd ដែលជាឈ្មោះអ្នកប្រើប្រាស់ និងវាល uid រៀងគ្នា។ ទោះយ៉ាងណាក៏ដោយ ទោះបីជាស្គ្រីបដំណើរការក៏ដោយ វាមិនល្អឥតខ្ចោះទេ - មិនមានចន្លោះរវាងវាលលទ្ធផលទាំងពីរទេ! អ្នកទាំងឡាយណាដែលធ្លាប់សរសេរកម្មវិធីជា bash ឬ python ប្រហែលជារំពឹងថានឹងមានពាក្យបញ្ជា print $1 $3 ដើម្បីបញ្ចូលចន្លោះរវាងវាលទាំងពីរនេះ។ ទោះយ៉ាងណាក៏ដោយ នៅពេលដែលបន្ទាត់ពីរលេចឡើងនៅជាប់គ្នាក្នុងកម្មវិធី awk នោះ awk ភ្ជាប់ពួកវាដោយមិនបន្ថែមចន្លោះរវាងពួកវា។ ពាក្យបញ្ជាខាងក្រោមនឹងបញ្ចូលចន្លោះរវាងវាល៖ $awk -F":" "(បោះពុម្ព $1 " " $3 )" /etc/passwd

នៅពេលបោះពុម្ពត្រូវបានគេហៅថាវិធីនេះ វាភ្ជាប់ $1, " " និង $3 ជាស៊េរី ដោយបង្កើតលទ្ធផលដែលអាចអានបានដោយមនុស្សនៅលើអេក្រង់។ ជាការពិតណាស់ យើងក៏អាចបញ្ចូលស្លាកវាលប្រសិនបើចាំបាច់៖ $ awk -F":" "( print " username: " $1 "\t\tuid: " $3" )" /etc/passwd

ជាលទ្ធផល យើងទទួលបានលទ្ធផលដូចខាងក្រោម៖ username: halt uid: 7

ឈ្មោះអ្នកប្រើ៖ ប្រតិបត្តិករ uid: ១១

ឈ្មោះអ្នកប្រើប្រាស់៖ root uid៖ ០

ឈ្មោះអ្នកប្រើប្រាស់៖ បិទ uid៖ ៦

ឈ្មោះអ្នកប្រើប្រាស់៖ ធ្វើសមកាលកម្ម uid៖ ៥

ឈ្មោះអ្នកប្រើប្រាស់៖ bin uid: ១

ស្គ្រីបខាងក្រៅ

បញ្ជូនស្គ្រីបទៅ awk ជាអាគុយម៉ង់ បន្ទាត់ពាក្យបញ្ជាប្រហែលជាងាយស្រួលសម្រាប់អត្ថបទមួយបន្ទាត់តូច ប៉ុន្តែនៅពេលនិយាយអំពីកម្មវិធីពហុជួរដ៏ស្មុគស្មាញ វាពិតជាប្រសើរជាងក្នុងការសរសេរស្គ្រីបជា ឯកសារខាងក្រៅ. បន្ទាប់មកអ្នកអាចចង្អុល awk ទៅកាន់ឯកសារស្គ្រីបនេះដោយប្រើជម្រើស -f:$ awk -f myscript.awk myfile.in

ការដាក់ស្គ្រីបនៅក្នុងឯកសារអត្ថបទដាច់ដោយឡែកក៏អនុញ្ញាតឱ្យអ្នកទាញយកអត្ថប្រយោជន៍ផងដែរ។ អត្ថប្រយោជន៍បន្ថែមអូក។ ឧទាហរណ៍ ស្គ្រីបពហុជួរខាងក្រោមធ្វើដូចគ្នានឹងបន្ទាត់មួយពីមុនរបស់យើងដែរ - បោះពុម្ពវាលទីមួយនៃបន្ទាត់នីមួយៗពី /etc/passwd: BEGIN (

ភាពខុសគ្នារវាងវិធីសាស្រ្តទាំងពីរនេះគឺជារបៀបដែលយើងបញ្ជាក់សញ្ញាបំបែកវាល។ នៅក្នុងស្គ្រីបនេះ អ្នកបំបែកវាលត្រូវបានបញ្ជាក់ខាងក្នុងដោយកម្មវិធីខ្លួនវា (ដោយកំណត់អថេរ FS) ចំណែកឯនៅក្នុងឧទាហរណ៍មុនរបស់យើង FS ត្រូវបានកំណត់រចនាសម្ព័ន្ធដោយឆ្លងកាត់ជម្រើស awk -F":" នៅលើបន្ទាត់ពាក្យបញ្ជា។ ជាធម្មតាវាជាការល្អបំផុតក្នុងការបញ្ជាក់អ្នកបំបែកវាលនៅក្នុងស្គ្រីបខ្លួនវា ដោយគ្រាន់តែព្រោះវានឹងមិនតម្រូវឱ្យអ្នកចងចាំអាគុយម៉ង់បន្ទាត់ពាក្យបញ្ជាផ្សេងទៀតទេ។ យើងនឹងពិនិត្យមើលអថេរ FS នៅក្នុងលម្អិតបន្ថែមទៀតនៅពេលក្រោយនៅក្នុងអត្ថបទនេះ។

BEGIN និង END ប្លុក

ជាធម្មតា awk ប្រតិបត្តិប្លុកនីមួយៗនៅក្នុងអត្ថបទស្គ្រីបម្តងសម្រាប់បន្ទាត់បញ្ចូលនីមួយៗ។ ទោះយ៉ាងណាក៏ដោយ ជារឿយៗមានស្ថានភាពក្នុងការសរសេរកម្មវិធី ដែលអ្នកត្រូវប្រតិបត្តិកូដចាប់ផ្តើម មុនពេល awk ចាប់ផ្តើមដំណើរការអត្ថបទពីឯកសារបញ្ចូល។ សម្រាប់ករណីបែបនេះ awk ផ្តល់នូវសមត្ថភាពក្នុងការកំណត់ប្លុក BEGIN ។ យើងបានប្រើប្លុក BEGIN នៅក្នុងឧទាហរណ៍មុន។ ដោយសារតែប្លុក BEGIN ត្រូវបានដំណើរការមុនពេល awk ចាប់ផ្តើមដំណើរការឯកសារបញ្ចូល នេះជាកន្លែងដ៏ល្អមួយដើម្បីចាប់ផ្តើមអថេរ FS (អ្នកបំបែកវាល) បញ្ចេញបឋមកថា ឬចាប់ផ្តើមអថេរសកលផ្សេងទៀតដែលនឹងត្រូវបានប្រើនៅពេលក្រោយនៅក្នុងកម្មវិធី។

Awk ក៏ផ្តល់នូវប្លុកពិសេសមួយទៀតដែលហៅថាប្លុក END ។ Awk ប្រតិបត្តិប្លុកនេះបន្ទាប់ពីបន្ទាត់ទាំងអស់នៅក្នុងឯកសារបញ្ចូលត្រូវបានដំណើរការ។ ជាធម្មតា ប្លុក END ត្រូវបានប្រើដើម្បីអនុវត្តការគណនាចុងក្រោយ ឬលទ្ធផលលទ្ធផលដែលគួរតែលេចឡើងនៅចុងបញ្ចប់នៃស្ទ្រីមលទ្ធផល។

កន្សោមធម្មតានិងប្លុក

Awk អនុញ្ញាតឱ្យអ្នកប្រើ កន្សោមធម្មតា។សម្រាប់ដំណើរការជ្រើសរើសប្លុកកម្មវិធីនីមួយៗ អាស្រ័យលើថាតើកន្សោមធម្មតាត្រូវគ្នានឹងបន្ទាត់បច្ចុប្បន្នឬអត់។ នេះជាឧទាហរណ៍ស្គ្រីបដែលបោះពុម្ពតែបន្ទាត់ទាំងនោះដែលមានលំដាប់តួអក្សរ foo:/foo/ (បោះពុម្ព)

ជាការពិតណាស់ អ្នកអាចប្រើកន្សោមធម្មតាដែលស្មុគស្មាញជាង។ នេះជាស្គ្រីបដែលនឹងបោះពុម្ពតែបន្ទាត់ដែលមានអណ្តែត៖ //+\.*/ (បោះពុម្ព)

កន្សោមនិងប្លុក

មានវិធីជាច្រើនទៀតដើម្បីជ្រើសរើសដំណើរការប្លុកនៃកម្មវិធីមួយ។ យើងអាចដាក់កន្សោម Boolean ណាមួយមុនប្លុកកម្មវិធី ដើម្បីគ្រប់គ្រងការប្រតិបត្តិនៃប្លុកនោះ។ Awk នឹងដំណើរការប្លុកកម្មវិធីតែប៉ុណ្ណោះ ប្រសិនបើកន្សោម Boolean ពីមុនវាយតម្លៃទៅពិត។ ស្គ្រីបឧទាហរណ៍ខាងក្រោមនឹងបញ្ចេញវាលទីបីនៃបន្ទាត់ទាំងអស់ដែលវាលទីមួយត្រូវបាន fred ។ ប្រសិនបើវាលដំបូងនៃបន្ទាត់បច្ចុប្បន្នមិន fred នោះ awk នឹងបន្តដំណើរការឯកសារ ហើយនឹងមិនចេញសេចក្តីថ្លែងការបោះពុម្ពសម្រាប់បន្ទាត់បច្ចុប្បន្នទេ: :$1 == "fred" (បោះពុម្ព $3)

Awk ផ្តល់ជូន សំណុំពេញលេញប្រតិបត្តិករប្រៀបធៀប រួមទាំង "=="," ធម្មតា<", ">", "<=", ">=" និង "!=" ។ លើសពីនេះ awk ផ្ដល់នូវសញ្ញា "~" និង "!"~" ដែលមានន័យថា "ផ្គូផ្គង" និង "មិនផ្គូផ្គង។" ពួកគេដាក់អថេរទៅខាងឆ្វេងនៃ operator និងកន្សោមធម្មតា នៅខាងស្ដាំរបស់វា នេះជាឧទាហរណ៍ដែលមានតែវាលទី 3 នៃបន្ទាត់ប៉ុណ្ណោះដែលត្រូវបានបោះពុម្ព ប្រសិនបើវាលទី 5 នៃបន្ទាត់ដូចគ្នាមានឫសលំដាប់តួអក្សរ: $5 ~ / root/ (បោះពុម្ព $ 3)

សេចក្តីថ្លែងការណ៍តាមលក្ខខណ្ឌ

Awk ក៏ផ្តល់នូវសេចក្តីថ្លែងការណ៍ C-like ដ៏ស្រស់ស្អាតផងដែរ។ ប្រសិនបើចង់បាន អ្នកអាចសរសេរអក្សរពីមុនឡើងវិញដោយប្រើ if:(

ប្រសិនបើ ($5 ~ / root/) (

ស្គ្រីបទាំងពីរដំណើរការដូចគ្នាបេះបិទ។ ក្នុងឧទាហរណ៍ទីមួយ កន្សោម boolean គឺនៅក្រៅប្លុក ខណៈពេលដែលនៅក្នុងឧទាហរណ៍ទីពីរ ប្លុកត្រូវបានប្រតិបត្តិសម្រាប់បន្ទាត់បញ្ចូលនីមួយៗ ហើយយើងជ្រើសរើសប្រតិបត្តិពាក្យបញ្ជាបោះពុម្ពដោយប្រើ if statement ទាំងពីរដំណើរការ ហើយយើងអាចជ្រើសរើសមួយ។ នោះ។ នៅក្នុងវិធីដ៏ល្អបំផុតបញ្ចូលគ្នាជាមួយផ្នែកផ្សេងទៀតនៃស្គ្រីប។

នេះជាច្រើនទៀត ឧទាហរណ៍ស្មុគស្មាញប្រសិនបើសេចក្តីថ្លែងការណ៍នៅក្នុង awk ។ ដូចដែលអ្នកអាចឃើញ ទោះបីជាមានលក្ខខណ្ឌដាក់គ្នាស្មុគស្មាញក៏ដោយ ប្រសិនបើសេចក្តីថ្លែងការណ៍មើលទៅដូចគ្នាបេះបិទទៅនឹងសមភាគី C របស់ពួកគេ :(

ប្រសិនបើ ($1 == "foo") (

ប្រសិនបើ ($2 == "foo") (

) ផ្សេងទៀតប្រសិនបើ ($1 == "របារ") (

ដោយប្រើ if statements យើងអាចបំប្លែងកូដនេះបាន៖ ! /matchme/ (បោះពុម្ព 1$3$4)

ដូចនេះ៖ (

ប្រសិនបើ ($0 !~ /matchme/) (

ស្គ្រីបទាំងពីរនឹងបោះពុម្ពតែបន្ទាត់ដែលមិនមានលំដាប់តួអក្សរ matchme ប៉ុណ្ណោះ។ ហើយក្នុងករណីនេះផងដែរ អ្នកអាចជ្រើសរើសវិធីសាស្រ្តដែលដំណើរការប្រសើរជាងនៅក្នុងកម្មវិធីជាក់លាក់មួយ។ ពួកគេទាំងពីរធ្វើដូចគ្នា។

Awk ក៏ផ្តល់ឱ្យអ្នកនូវសមត្ថភាពក្នុងការប្រើប្រតិបត្តិករប៊ូលីន "||" ("ឡូជីខល OR") និង "&&" ("ឡូជីខល AND") ដែលអនុញ្ញាតឱ្យអ្នកបង្កើតកន្សោមប៊ូលីនស្មុគស្មាញបន្ថែមទៀត៖ ($1 == "foo") && ($2 == "bar") (បោះពុម្ព)

ឧទាហរណ៍​នេះ​នឹង​ចេញ​តែ​ជួរ​ដេក​ដែល​វាល​ទី​មួយ​គឺ foo ហើយ​វាល​ទីពីរ​គឺ​របារ។

អថេរជាលេខ!

រហូតមកដល់ពេលនេះ យើងបានបោះពុម្ពអថេរខ្សែអក្សរ ខ្សែអក្សរទាំងមូល ឬវាលជាក់លាក់។ ទោះជាយ៉ាងណាក៏ដោយ awk ក៏ផ្តល់ឱ្យយើងនូវសមត្ថភាពក្នុងការធ្វើការប្រៀបធៀបទាំងចំនួនគត់ និងលេខចំនុចអណ្តែត។ ដោយប្រើកន្សោមគណិតវិទ្យា វាងាយស្រួលណាស់ក្នុងការសរសេរស្គ្រីបដែលរាប់លេខ បន្ទាត់ទទេនៅក្នុងឯកសារ។ នេះគឺជាស្គ្រីបមួយ៖ BEGIN (x=0)

បញ្ចប់ (បោះពុម្ព "រកឃើញ " x " បន្ទាត់ទទេ។ :)"

នៅក្នុងប្លុក BEGIN យើងចាប់ផ្តើមអថេរចំនួនគត់របស់យើង x ទៅសូន្យ។ បន្ទាប់មក រាល់ពេលដែល awk ជួបនឹងបន្ទាត់ទទេ វានឹងប្រតិបត្តិសេចក្តីថ្លែងការណ៍ x=x+1 ដោយបង្កើន x ដោយ 1។ នៅពេលដែលបន្ទាត់ទាំងអស់ត្រូវបានដំណើរការ ប្លុក END នឹងត្រូវបានប្រតិបត្តិ ហើយ awk នឹងបោះពុម្ពសរុបចុងក្រោយដោយចង្អុលបង្ហាញ ចំនួនបន្ទាត់ទទេដែលបានរកឃើញ។

អថេរខ្សែអក្សរ

រឿងដ៏ល្អមួយអំពីអថេរ awk គឺថាពួកវាជា "ធម្មតា និងអក្សរតូច" ។ ខ្ញុំហៅអថេរ awk ថា "string" ពីព្រោះអថេរ awk ទាំងអស់ត្រូវបានរក្សាទុកនៅខាងក្នុងជាខ្សែអក្សរ។ ក្នុងពេលជាមួយគ្នានោះ អថេរ awk គឺ "សាមញ្ញ" ពីព្រោះអ្នកអាចធ្វើប្រតិបត្តិការគណិតវិទ្យាលើអថេរ ហើយប្រសិនបើវាមាន បន្ទាត់លេខ, awk នឹងថែរក្សាការបំប្លែងខ្សែអក្សរទៅជាលេខដោយស្វ័យប្រវត្តិ។ ដើម្បី​ដឹង​ថា​ខ្ញុំ​មាន​ន័យ​យ៉ាង​ណា សូម​មើល​ឧទាហរណ៍​នេះ៖ x="1.01"

# យើងបង្កើត x មាន *string* "1.01"

# យើងទើបតែបន្ថែម 1 ទៅ *string*

#នេះជាមតិយោបល់ :)

Awk នឹង​បញ្ចេញ៖ 2.01

ឆ្ងល់! ទោះបីជាយើងបានកំណត់តម្លៃខ្សែអក្សរ 1.01 ទៅ x ក៏ដោយ យើងនៅតែអាចបន្ថែមមួយទៅវាបាន។ យើង​មិន​អាច​ធ្វើ​បែប​នេះ​ដោយ​ប្រើ​បាស ឬ​ពស់ថ្លាន់​ទេ។ ជាដំបូង bash មិនគាំទ្រលេខនព្វន្ធចំណុចអណ្តែតទេ។ ហើយខណៈពេលដែល bash មានអថេរ "ខ្សែអក្សរ" ពួកគេមិនមែនជា "សាមញ្ញ" ទេ។ ដើម្បីអនុវត្តណាមួយ។ ប្រតិបត្តិការគណិតវិទ្យា bash តម្រូវឱ្យយើងរុំការគណនារបស់យើងជា $() constructs ដ៏អាក្រក់។ ប្រសិនបើយើងកំពុងប្រើ python យើងនឹងត្រូវការបំប្លែងខ្សែអក្សរ 1.01 របស់យើងឱ្យច្បាស់លាស់ទៅជាតម្លៃចំនុចអណ្តែតទឹក មុនពេលធ្វើការគណនាជាមួយវា។ ទោះបីជាវាមិនពិបាកក៏ដោយក៏វានៅតែដដែល ជំហានបន្ថែម. ក្នុងករណី awk ទាំងអស់នេះត្រូវបានធ្វើដោយស្វ័យប្រវត្តិ ហើយវាធ្វើឱ្យកូដរបស់យើងស្អាត និងស្អាត។ ប្រសិនបើ​យើង​ត្រូវ​ការ​ការ៉េ​ទី​មួយ​នៃ​ខ្សែ​បញ្ចូល​នីមួយៗ ហើយ​បន្ថែម​មួយ​ទៅ​វា យើង​នឹង​ប្រើ​ស្គ្រីប​ដូច​នេះ៖ (បោះពុម្ព ($1^2)+1)

ប្រសិនបើអ្នកពិសោធន៍បន្តិច អ្នកនឹងឃើញថា ប្រសិនបើអថេរមិនមានលេខត្រឹមត្រូវ awk នឹងចាត់ទុកអថេរនោះជាលេខសូន្យ នៅពេលវាយតម្លៃកន្សោមគណិតវិទ្យា។

ប្រតិបត្តិករជាច្រើន។

លក្ខណៈពិសេសល្អមួយទៀតរបស់ awk គឺ សំណុំពេញលេញប្រតិបត្តិករគណិតវិទ្យា។ បន្ថែមពីលើការបូក ដក គុណ និងចែកជាស្តង់ដារ awk ផ្តល់ឱ្យយើងនូវសមត្ថភាពក្នុងការប្រើសញ្ញាប្រមាណវិធីនិទស្សន្តដែលបានបង្ហាញពីមុន "^", សញ្ញាប្រមាណវិធីដែលនៅសល់ ការបែងចែកចំនួនគត់"%" និងប្រតិបត្តិករកិច្ចការងាយស្រួលជាច្រើនទៀតដែលខ្ចីពី C.

ទាំងនេះរួមមាន ប្រតិបត្តិករចាត់តាំងមុន និងក្រោយការបន្ថែម/បន្ថយ (i++, --foo) ប្រតិបត្តិករចាត់ចែងជាមួយការបូក/ដក/គុណ/ចែក (a+=3, b*=2, c/=2.2, d-=6.2) . ប៉ុន្តែនោះមិនមែនទាំងអស់នោះទេ - យើងក៏មានប្រតិបត្តិករការចាត់តាំងដ៏ងាយស្រួលជាមួយនឹងការគណនានៅសល់នៃការបែងចែកចំនួនគត់ និងនិទស្សន្ត (a^=2, b%=4)។

ឧបករណ៍បំបែកវាល

awk មានសំណុំអថេរពិសេសផ្ទាល់ខ្លួន។ ពួកគេខ្លះធ្វើឱ្យវាអាចទៅរួច ការលៃតម្រូវការងារ awk និងផ្សេងទៀតមាន ព័ត៌មានដ៏មានតម្លៃអំពីការបញ្ចូល។ យើងបានប៉ះលើអថេរពិសេសមួយក្នុងចំណោមអថេរទាំងនេះរួចហើយ FS ។ ដូចដែលបានរៀបរាប់ពីមុន អថេរនេះអនុញ្ញាតឱ្យអ្នកបញ្ជាក់លំដាប់នៃតួអក្សរដែល awk នឹងចាត់ទុកជាសញ្ញាបំបែកវាល។ នៅពេលដែលយើងប្រើ /etc/passwd ជាការបញ្ចូល FS ត្រូវបានកំណត់ទៅជា ":" ។ វាបានប្រែទៅជាគ្រប់គ្រាន់ ប៉ុន្តែ FS ផ្តល់ឱ្យយើងនូវភាពបត់បែនកាន់តែច្រើន។

តម្លៃនៃអថេរ FS មិនចាំបាច់ជាតួអក្សរតែមួយទេ។ វាអាចត្រូវបានកំណត់ជាកន្សោមធម្មតាដែលបញ្ជាក់លំនាំតួអក្សរនៃប្រវែងណាមួយ។ ប្រសិនបើអ្នកកំពុងដំណើរការវាលដែលបំបែកដោយតួអក្សរផ្ទាំងមួយ ឬច្រើននោះ FS ត្រូវតែកំណត់រចនាសម្ព័ន្ធដូចខាងក្រោម៖ FS="\t+"

ខាងលើយើងបានប្រើ តួអក្សរពិសេសកន្សោមធម្មតា "+" ដែលមានន័យថា "ការកើតឡើងមួយ ឬច្រើននៃតួអក្សរមុន" ។

ប្រសិនបើវាលត្រូវបានបំបែកដោយចន្លោះពណ៌ស (ចន្លោះមួយ ឬច្រើន ឬផ្ទាំង) អ្នកប្រហែលជាចង់កំណត់ FS ទៅជាកន្សោមធម្មតាខាងក្រោម៖ FS="[[:space:]+]"

ខណៈពេលដែលការដំឡើងនេះនឹងដំណើរការ វាមិនចាំបាច់ទេ។ ហេតុអ្វី? ដោយសារតែតម្លៃលំនាំដើមនៃ FS គឺជាតួអក្សរដកឃ្លាមួយ ដែល awk បកប្រែថាជា "ចន្លោះមួយ ឬច្រើន ឬផ្ទាំង"។ នៅក្នុងរបស់យើង។ ឧទាហរណ៍ជាក់លាក់តម្លៃ FS លំនាំដើមគឺពិតជាអ្វីដែលយើងត្រូវការ!

ក៏មិនមានបញ្ហាជាមួយនឹងកន្សោមធម្មតាស្មុគស្មាញដែរ។ ទោះបីជាកំណត់ត្រាត្រូវបានបំបែកដោយពាក្យ "foo" អមដោយបីខ្ទង់ក៏ដោយ កន្សោមធម្មតាខាងក្រោមនឹងញែកទិន្នន័យឱ្យបានត្រឹមត្រូវ៖ FS="foo"

ចំនួនវាល

អថេរពីរបន្ទាប់ដែលយើងនឹងមើលជាធម្មតាមិនមានន័យថាត្រូវបានសរសេរទៅនោះទេ ប៉ុន្តែត្រូវបានប្រើដើម្បីអាន និងទទួលបាន ព័ត៌មានមានប្រយោជន៍អំពីការបញ្ចូល។ ទីមួយនៃទាំងនេះគឺជាអថេរ NF ដែលត្រូវបានគេហៅថា "ចំនួនវាល" ផងដែរ។ Awk កំណត់តម្លៃនៃអថេរនេះដោយស្វ័យប្រវត្តិទៅចំនួនវាលនៅក្នុងកំណត់ត្រាបច្ចុប្បន្ន។ អ្នកអាចប្រើអថេរ NF ដើម្បីបង្ហាញតែបន្ទាត់បញ្ចូលជាក់លាក់ប៉ុណ្ណោះ៖ NF == 3 (បោះពុម្ព "មានវាលបីនៅក្នុងធាតុនេះ៖ " $0 )

ជាការពិតណាស់ អថេរ NF ក៏អាចត្រូវបានប្រើនៅក្នុង សេចក្តីថ្លែងការណ៍តាមលក្ខខណ្ឌឧទាហរណ៍៖(

ប្រសិនបើ (NF > 2) (

បោះពុម្ព $1 " " $2 " : " $3

លេខកត់ត្រា

អថេរងាយស្រួលមួយទៀតគឺលេខកំណត់ត្រា (NR) ។ វាតែងតែមានលេខនៃកំណត់ត្រាបច្ចុប្បន្ន (awk ចាត់ទុកកំណត់ត្រាដំបូងជាកំណត់ត្រាលេខ 1) ។ រហូតមកដល់ពេលនេះយើងបានដោះស្រាយ ឯកសារបញ្ចូលដែលមានធាតុមួយក្នុងមួយជួរ។ ក្នុងស្ថានភាពបែបនេះ NR ក៏នឹងរាយការណ៍អំពីលេខបន្ទាត់បច្ចុប្បន្នផងដែរ។ ទោះជាយ៉ាងណាក៏ដោយ នៅពេលដែលយើងចាប់ផ្តើមដោះស្រាយកំណត់ត្រាពហុជួរនៅក្នុងអត្ថបទក្រោយៗទៀតនៅក្នុងស៊េរីនេះ វានឹងលែងជាករណីទៀតហើយ ដូច្នេះអ្នកត្រូវប្រុងប្រយ័ត្ន! NR អាច​ត្រូវ​បាន​ប្រើ​ដូច​ជា​អថេរ NF ដើម្បី​បញ្ចេញ​តែ​ប៉ុណ្ណោះ។ បន្ទាត់ជាក់លាក់បញ្ចូល៖(NR< 10) || (NR >100) (បោះពុម្ព "យើងស្ថិតនៅលើកំណត់ត្រាលេខ 1-9 ឬ 101 ឬច្រើនជាងនេះ")

ឧទាហរណ៍មួយទៀត៖(

ប្រសិនបើ (NR> 10) (

បោះពុម្ព "ឥឡូវនេះព័ត៌មានពិតនឹងមកដល់!"

Awk ផ្តល់អថេរបន្ថែមដែលអាចត្រូវបានប្រើសម្រាប់គោលបំណងផ្សេងៗ។ យើងនឹងពិនិត្យមើលអថេរទាំងនេះនៅក្នុងអត្ថបទនាពេលអនាគត។ យើង​បាន​ឈាន​ដល់​ការ​បញ្ចប់​នៃ​ការ​ស្វែង​រក​ដំបូង​របស់ awk ។ នៅក្នុងអត្ថបទនាពេលអនាគតនៅក្នុងស៊េរី ខ្ញុំនឹងបង្ហាញមុខងារ awk កម្រិតខ្ពស់បន្ថែមទៀត ហើយយើងនឹងបញ្ចប់ស៊េរីនេះជាមួយនឹងកម្មវិធី awk ពិភពពិត។ ក្នុងពេលនេះ ប្រសិនបើអ្នកចង់ស្វែងយល់បន្ថែម អ្នកអាចពិនិត្យមើលធនធានដែលមានរាយខាងក្រោម។

04.10.2015
16:55

ឧបករណ៍ប្រើប្រាស់ awk គឺជាឧទាហរណ៍នៃបុរាណមួយ។ កម្មវិធីលីនុចសម្រាប់ដំណើរការអត្ថបទ។ វា​គឺ​ជា​ការ​ល្អ​ប្រសើរ​និង​មាន​ប្រសិទ្ធិ​ភាព​ខ្លាំង​ណាស់​ទោះ​បី​ជា​វា​មិន​បាន​ផ្តល់​នូវ​ភាសា​កម្មវិធី​ពេញ​លេញ​។ ទោះជាយ៉ាងណាក៏ដោយ សូមប្រាកដថា សមត្ថភាពរបស់វាគ្រប់គ្រាន់ក្នុងការដោះស្រាយបញ្ហាជាច្រើន។ ដំណើរការដោយស្វ័យប្រវត្តិអត្ថបទ (ជាពិសេសនៅពេលរួមបញ្ចូលគ្នាជាមួយឧបករណ៍ប្រើប្រាស់កុងសូលផ្សេងទៀត) ។

វិធីដើម្បីដំណើរការកម្មវិធី awk

ប្រសិនបើកម្មវិធី awk គឺសាមញ្ញ និងខ្លី នោះកូដរបស់វាអាចត្រូវបានវាយដោយផ្ទាល់ទៅក្នុងកុងសូល៖

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

អ្នកអាចប្រើច្រើនជាង awk ជាការបញ្ចូល៖ ឯកសារអត្ថបទប៉ុន្តែក៏មានទិន្នផលផងដែរ។ ស្ទ្រីមស្តង់ដារកម្មវិធីផ្សេងទៀត៖

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

ក្នុងករណីដែលកូដកម្មវិធី awk មានទំហំធំ ឬត្រូវតែរក្សាទុកសម្រាប់ ប្រើឡើងវិញវាអាចត្រូវបានហៅចេញពីឯកសារដែលមានកុងតាក់ -f៖

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

ដើម្បីអនុវត្តការពិសោធន៍ យើងប្រើឯកសារ test.cpp ដែលយើងនឹងពិនិត្យមើលលទ្ធផលនៃកម្មវិធី awk៖

# រួមបញ្ចូល # រួមបញ្ចូល # រួមបញ្ចូល ការធ្វើតេស្តគ្មានសុពលភាព 1 (); int test2(); // C style comment សម្រាប់ main() function 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; }

ការផ្សាយពាណិជ្ជកម្ម

ត្រងខ្សែអក្សរដោយប្រើ awk

ជាដំបូង awk អនុញ្ញាតឱ្យអ្នកជ្រើសរើសបន្ទាត់ពីអត្ថបទដោយផ្អែកលើកន្សោមធម្មតា និងលក្ខខណ្ឌជាលេខមួយចំនួន។

ការជ្រើសរើសខ្សែអក្សរដែលត្រូវគ្នានឹងកន្សោមធម្មតា។

ឧទាហរណ៍ ដើម្បីទទួលបានបន្ទាត់ទាំងអស់នៅក្នុងឯកសារ test.cpp ដែលមានការណែនាំ #include preprocessor យើងនឹងប្រើពាក្យបញ្ជាខាងក្រោម៖

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

កន្សោមធម្មតាត្រូវបានសរសេររវាងពីរ/តួអក្សរ។ ជាលទ្ធផលយើងទទួលបាន៖

# រួមបញ្ចូល # រួមបញ្ចូល # រួមបញ្ចូល

ការជ្រើសរើសខ្សែអក្សរដែលមិនត្រូវគ្នានឹងកន្សោមធម្មតា។

ដើម្បីទុកបន្ទាត់ទាំងអស់ដែលមិនត្រូវគ្នានឹងកន្សោមធម្មតា ប្រើពាក្យបញ្ជាពីផ្នែករងមុន ហើយបន្ថែមសញ្ញាឧទានមួយទៅដើមនៃកូដ awk ។ ជាឧទាហរណ៍ វិធីនេះយើងនឹងដកចេញនូវបន្ទាត់ដែលបានអធិប្បាយទាំងអស់៖

អាក់ "! /^[/](2).*/" test.cpp

នេះជាអ្វីដែលនៅសេសសល់៖

# រួមបញ្ចូល # រួមបញ្ចូល # រួមបញ្ចូល ការធ្វើតេស្តឥតបានការ 1(); 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; }

ការជ្រើសរើសជួរពីជួរដែលបានផ្តល់ឱ្យ

អ្នកអាចកំណត់ជួរនៃខ្សែដែលត្រូវបង្ហាញនៅលើអេក្រង់ដោយប្រើកន្សោមធម្មតាពីរ ដោយបំបែកដោយសញ្ញាក្បៀស។ ជាឧទាហរណ៍ ចូរយើងស្វែងរកនិយមន័យនៃមុខងារទាំងអស់ដែលត្រឡប់ int៖

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

លទ្ធផលពាក់ព័ន្ធ៖

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; }

ការរួមបញ្ចូលគ្នានៃលក្ខខណ្ឌតម្រង

ដើម្បីពិនិត្យខ្សែអក្សរប្រឆាំងនឹងលក្ខខណ្ឌជាច្រើនក្នុងពេលតែមួយ សូមប្រើសញ្ញា && (AND) និង || ។ (ឬ)។

ពាក្យបញ្ជាខាងក្រោមបោះពុម្ពមតិយោបល់ទាំងអស់ដែលមិនមានមេ៖

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

ជាលទ្ធផលយើងមាន៖

// អត្ថាធិប្បាយរចនាប័ទ្ម C សម្រាប់មុខងារ test1() // មតិយោបល់រចនាប័ទ្ម C សម្រាប់មុខងារ test2()

ពីមុន យើងបានស្វែងរកជួរនៃបន្ទាត់ដោយប្រើកន្សោមធម្មតាពីរ ប៉ុន្តែប្រសិនបើលេខបន្ទាត់ដែលត្រូវការលទ្ធផលត្រូវបានដឹងជាមុន នោះអ្វីៗទាំងអស់ត្រូវបានធ្វើឱ្យសាមញ្ញ៖

អាក” ៤< NR && NR < 7" test.cpp

NR គឺជាអថេរ awk ដែលបញ្ជាក់លេខបន្ទាត់។ ដូច្នេះ កូដ​ដែល​បាន​បង្ហាញ​ចេញ​ពី​ជួរ​ទី ៥ និង​ទី ៦៖

ការ​ធ្វើ​តេ​ស្ត 1(); int test2();

ការជ្រើសរើសបន្ទាត់ដោយផ្អែកលើលក្ខខណ្ឌទាក់ទងនឹងពាក្យបុគ្គល

Awk អាច​ត្រង​អត្ថបទ​មិន​ត្រឹម​តែ​តាម​បន្ទាត់​ប៉ុណ្ណោះ​ទេ ប៉ុន្តែ​ក៏​ដោយ​ពាក្យ​នីមួយៗ​ផងដែរ។ ពាក្យ i -th នៅក្នុងបន្ទាត់អាចត្រូវបានយោងដោយប្រើ $i ។ លេខរៀងចាប់ផ្តើមពីមួយ ហើយ $0 កំណត់មាតិកានៃបន្ទាត់ទាំងមូល។ ចំនួនពាក្យនៅក្នុងបន្ទាត់មួយត្រូវបានកំណត់ដោយប្រើអថេរ NF ដូច្នេះ $NF ចង្អុលទៅពាក្យចុងក្រោយ។ ជាឧទាហរណ៍ សូមស្វែងរកបន្ទាត់ដែលពាក្យដំបូងគឺ int ឬចាត់ទុកជាមោឃៈ។

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

ទិន្នផលកុងសូលដែលត្រូវគ្នា៖

ការ​ធ្វើ​តេ​ស្ត 1(); int test2(); int main(int argc, char** argv) ( void test1() ( int test2() (

ទោះយ៉ាងណាក៏ដោយ វាកាន់តែងាយស្រួលប្រើការត្រួតពិនិត្យកន្សោមធម្មតាប្រឆាំងនឹងពាក្យមួយ។ ដើម្បីធ្វើដូច្នេះ awk ផ្តល់នូវប្រតិបត្តិករពិសេស ~ ដែលត្រូវតែដាក់នៅចន្លោះអថេរដែលចង្អុលទៅពាក្យ និងកន្សោមធម្មតា។ ជាឧទាហរណ៍ ចូរយើងសរសេរពាក្យបញ្ជាពីមុនឡើងវិញក្នុងទម្រង់បង្រួមជាងមុន៖

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

ជ្រើសរើសជួរដេកដោយផ្អែកលើលក្ខណៈលេខ

ប្រតិបត្តិករនព្វន្ធភាសា C មាននៅក្នុង awk ដែលផ្តល់ឱ្យអ្នកនូវសេរីភាពនៃសកម្មភាព។ ឧទាហរណ៍ខាងក្រោមបោះពុម្ពបន្ទាត់គូទាំងអស់ (NR គឺជាលេខបន្ទាត់)៖

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

ទិន្នផលដែលពាក់ព័ន្ធ៖

# រួមបញ្ចូល int test2(); // C style comment សម្រាប់ main() function std::cout<< "Hello, world!" << std::endl; for(int i = 0; i < 10; ++i) { } return 0; void test1() { } // Комментарий в стиле С для функции test2() std::cout << "Hello, test2!" << std::endl;

កម្មវិធី awk ខាងក្រោមបោះពុម្ពបន្ទាត់ទាំងអស់ដែលពាក្យទី 1 មានប្រវែងបី៖

Awk "ប្រវែង($1) == 3" test.cpp

ជាលទ្ធផលយើងទទួលបាន៖

តេស្ត int2(); int main(int argc, char** argv) ( int test2() (

Awk "NF == 2" test.cpp

និងទិន្នផលដែលត្រូវគ្នា៖

# រួមបញ្ចូល # រួមបញ្ចូល # រួមបញ្ចូល ការធ្វើតេស្តឥតបានការ 1(); int test2();

ការផ្សាយពាណិជ្ជកម្ម

ត្រឡប់ 0;

ធ្វើការជាមួយខ្សែអក្សរនៅក្នុង awk

ដូចដែលអ្នកអាចឃើញ awk មានសំណុំមុខងារដ៏ល្អសម្រាប់ត្រងខ្សែអក្សរ។ ទោះយ៉ាងណាក៏ដោយ អ្នកនៅតែអាចធ្វើការបំប្លែងផ្សេងៗលើខ្សែទាំងនេះបាន។ ពាក្យបញ្ជាខ្សែអក្សរត្រូវតែរុំដោយដង្កៀបអង្កាញ់ (...) ។ កូដក្នុងវង់ក្រចកត្រូវបានហៅតាមលំដាប់លំដោយសម្រាប់បន្ទាត់នីមួយៗនៃអត្ថបទដែលកំពុងដំណើរការ។

លទ្ធផលដែលបានធ្វើទ្រង់ទ្រាយ

Awk មានសមមូលផ្ទាល់ទៅនឹងមុខងារ C printf()។ ជាឧទាហរណ៍ ចូរយើងបោះពុម្ពលេខរបស់វានៅដើមបន្ទាត់នីមួយៗ៖

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

នេះជាអ្វីដែលយើងទទួលបាន៖ 1 # រួមបញ្ចូល 2 # រួមបញ្ចូល 3 # រួមបញ្ចូល<< "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 }

4 5 ការធ្វើតេស្តចាត់ទុកជាមោឃៈ1(); 6 int test2(); 7 8 // អត្ថាធិប្បាយរចនាប័ទ្ម C សម្រាប់អនុគមន៍ main() 9 int main(int argc, char** argv) ( 10 std::cout

មុខងារបំប្លែង

បន្ថែមពីលើ printf() awk មានមុខងារផ្សេងទៀត។ ឧទាហរណ៍ print() និង topper()៖

លទ្ធផលពាក់ព័ន្ធ៖

#រួមបញ្ចូល #រួមបញ្ចូល #រួមបញ្ចូល តេស្ត VOID 1(); តេស្ត INT2(); // C-Style COMMENT FOR MAIN() មុខងារ 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; }

លក្ខខណ្ឌ

សេចក្តីថ្លែងការណ៍ If-else មាននៅក្នុងកម្មវិធី awk ។ ឧទាហរណ៍ កូដខាងក្រោមបោះពុម្ពដោយមិនផ្លាស់ប្តូរបន្ទាត់ដែលមាន int នៅក្នុងទីតាំងទី 1 ហើយ (នៅចុងក្រោយ បើមិនដូច្នេះទេ --- ត្រូវបានបញ្ជូនទៅកុងសូល៖

Awk " (ប្រសិនបើ($1 == "int" && $NF == "() print; else print "---" )" test.cpp

ដំណើរការកូដបង្កើតលទ្ធផលដូចខាងក្រោមៈ

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

អថេរ

អថេរដែលមិនចាំបាច់ត្រូវបានប្រកាសជាមុនក៏មាននៅក្នុងកម្មវិធី awk ផងដែរ។ កូដខាងក្រោមសម្រាប់រាប់ចំនួនបន្ទាត់ និងពាក្យនៅក្នុងអត្ថបទនឹងត្រូវបានដាក់ក្នុងឯកសារ stat.awk៖

( lineCount ++; wordCount += NF ) END ( printf "ចំនួនបន្ទាត់៖ %d, ចំនួនពាក្យ៖ %d\n", lineCount, wordCount)

បន្ទាប់មកវាត្រូវបានគេហៅថា:

Awk -f stat.awk test.cpp

លទ្ធផលអនុវត្ត៖

ចំនួនបន្ទាត់៖ ២៧, ចំនួនពាក្យ៖ ៨៨

តម្រង END បញ្ជាក់​ថា​កូដ​ក្នុង​វង់ក្រចក​បន្ទាប់​ពី​វា​គួរ​ត្រូវ​បាន​ប្រតិបត្តិ​តែ​បន្ទាប់​ពី​បន្ទាត់​ទាំងអស់​ត្រូវ​បាន​ឆ្លងកាត់​ប៉ុណ្ណោះ។ តម្រង BEGIN ក៏មាននៅក្នុង awk ផងដែរ ដូច្នេះក្នុងករណីទូទៅ កម្មវិធីមានទម្រង់៖

BEGIN (បានហៅមុនពេលការឆ្លងកាត់ជួរដេកចាប់ផ្តើម) (បានហៅសម្រាប់ជួរនីមួយៗបន្ទាប់ពីផ្នែក BEGIN ប៉ុន្តែមុនផ្នែក END) END (ហៅបន្ទាប់ពីជួរដេកឆ្លងកាត់បានបញ្ចប់)

Wc -lw test.cpp

វដ្ត

នៅក្នុងកម្មវិធី awk អ្នកក៏មានសិទ្ធិចូលប្រើរចនាប័ទ្ម C សម្រាប់ និងខណៈពេលរង្វិលជុំផងដែរ។ ជាឧទាហរណ៍ ចូរយើងបោះពុម្ពបន្ទាត់ទាំងអស់តាមលំដាប់បញ្ច្រាស។ តោះបង្កើតឯកសារ reverse.awk ដែលមានខ្លឹមសារដូចខាងក្រោម៖

(សម្រាប់(i = NF; i> 0; --i) printf "%s ", $i; printf "\n" )

តោះហៅកម្មវិធីដូចខាងក្រោម៖

Awk -f reverse.awk test.cpp

ជាលទ្ធផល ពាក្យនៅក្នុងបន្ទាត់នីមួយៗនឹងត្រូវបានបោះពុម្ពតាមលំដាប់បញ្ច្រាស៖

# រួមបញ្ចូល # រួមបញ្ចូល #រួមបញ្ចូលការធ្វើតេស្ត1(); ការធ្វើតេស្តឥតបានការ 2(); មុខងារ int main() សម្រាប់រចនាប័ទ្ម C ក្នុង Comment // () 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 }

សញ្ញាបំបែកពាក្យមិនស្តង់ដារ

តាមលំនាំដើម awk ប្រើតួអក្សរដកឃ្លាជាសញ្ញាបំបែកពាក្យ ប៉ុន្តែឥរិយាបថនេះអាចត្រូវបានផ្លាស់ប្តូរ។ ដើម្បីធ្វើដូចនេះសូមប្រើកុងតាក់ -F បន្តដោយបន្ទាត់កំណត់សញ្ញាបំបែក។ ឧទាហរណ៍ កម្មវិធីខាងក្រោមបង្ហាញឈ្មោះក្រុម និងអ្នកប្រើប្រាស់របស់វា (ប្រសិនបើមានអ្នកប្រើប្រាស់នៅក្នុងក្រុម) ពីឯកសារ /etc/group ដោយប្រើតួអក្សរសញ្ញាសម្គាល់ជាសញ្ញាកំណត់៖

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

ការរួមបញ្ចូលគ្នានៃតម្រង និងពាក្យបញ្ជាបោះពុម្ព

តម្រងដែលបានពិភាក្សាពីមុនទាំងអស់អាចត្រូវបានប្រើដោយភ្ជាប់ជាមួយពាក្យបញ្ជាដំណើរការខ្សែអក្សរ។ វាគ្រប់គ្រាន់ហើយក្នុងការសរសេរការរឹតបន្តឹងមុនពេលដង្កៀបអង្កាញ់។ ខាងក្រោមនេះជាឧទាហរណ៍ដើម្បីបោះពុម្ព 9 ជួរដំបូងនៃលទ្ធផលនៃពាក្យបញ្ជា ps ដែលមានព័ត៌មានអំពីអ្នកប្រើប្រាស់ លេខសម្គាល់ដំណើរការ និងឈ្មោះពាក្យបញ្ជា៖

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

បន្ទាប់ពីការបើកដំណើរការយើងនឹងឃើញ:

អ្នកប្រើប្រាស់ PID ពាក្យបញ្ជា root 1 /sbin/init root 2 root 3 root 5 root 7 root 8 root 9 root 10

នៅក្នុងអត្ថបទនេះ ខ្ញុំមានគម្រោងចែករំលែកឧទាហរណ៍ដែលមានប្រយោជន៍ដែលជួយខ្ញុំដោះស្រាយបញ្ហាប្រចាំថ្ងៃ និងធ្វើឱ្យការប្រើប្រាស់បន្ទាត់ពាក្យបញ្ជាមានភាពសាមញ្ញ។ សម្រាប់អ្នកដែលមិនទាន់ស្គាល់ AWK ខ្ញុំសូមណែនាំថាអ្នកប្រាកដជាស្ទាត់ជំនាញភាសាស្គ្រីបនេះ មិនមានអ្វីស្មុគស្មាញទេ។ ខ្ញុំមានគម្រោងអមជាមួយឧទាហរណ៍នីមួយៗជាមួយនឹងមតិយោបល់តូចៗដែលបំភ្លឺលើភាពខុសប្លែកនៃការប្រើប្រាស់ប្រតិបត្តិករជាក់លាក់។
.

យើងកំពុងស្វែងរកបន្ទាត់ដែលមានប៉ារ៉ាម៉ែត្រ bind-អាសយដ្ឋាននៅក្នុងឯកសារកំណត់រចនាសម្ព័ន្ធ។

root@debian៖ ~# awk '/bind-address/' /etc/mysql/my.cnf
bind-address = 127.0.0.1
bind-address = 192.168.1.110

ការពន្យល់៖ AWK មានវាក្យសម្ព័ន្ធ និងជម្រើសដូចខាងក្រោម។

អូក[-f program_file | 'កម្មវិធី'] [-Fdelimiter]
[-v variable=value] [ឯកសារ ...]

-Fតម្លៃ — កំណត់សញ្ញាបំបែក (កំណត់តម្លៃនៃអថេរ FS ដែលភ្ជាប់មកជាមួយ);
-fឯកសារ - អត្ថបទកម្មវិធីត្រូវបានអានពីឯកសារជំនួសឱ្យបន្ទាត់ពាក្យបញ្ជា។ ការអានពីឯកសារច្រើនត្រូវបានគាំទ្រ។
-v var=value - ផ្តល់តម្លៃដែលត្រូវការទៅអថេរ;
−− - សម្គាល់ចុងបញ្ចប់នៃបញ្ជីជម្រើស។

ឧទាហរណ៍លេខ 2

នៅក្នុងឧទាហរណ៍ខាងលើ ការស្វែងរកត្រូវបានធ្វើឡើងក្នុងឯកសារមួយ ប៉ុន្តែ AWK ក៏អាចទទួលយកលទ្ធផលនៃពាក្យបញ្ជាផ្សេងទៀតផងដែរ។ ចូរ​យើង​ព្យាយាម​ធ្វើ​ឲ្យ​ឧទាហរណ៍​របស់​យើង​ស្មុគស្មាញ​ទៅ​តាម។

root@debian-wordpress:~# ឆ្មា /etc/mysql/my.cnf | awk '/bind-address/'
bind-address = 127.0.0.1
bind-address = 192.168.1.110

ដូចដែលអ្នកអាចឃើញលទ្ធផលលទ្ធផលនៅតែដដែលទោះបីជាការរចនាកាន់តែស្មុគស្មាញក៏ដោយ។ វាត្រូវតែនិយាយថានៅក្នុងឧទាហរណ៍នេះវាមិនត្រូវបានគេណែនាំឱ្យប្រើជម្រើសទីពីរទាំងស្រុងទេព្រោះវាមានភាពស្មុគស្មាញជាង។ ចូរយើងព្យាយាមពិចារណាស្ថានភាពផ្សេងទៀតដែលការប្រើប្រាស់ការរចនាបែបនេះនឹងមានភាពយុត្តិធម៌។

ឧទាហរណ៍លេខ 3

រាយតំណនិមិត្តសញ្ញា និងផ្លូវទៅកាន់ឯកសារគោលដៅ។

root@debian៖ ~# ls -l /bin/ | awk '/lrwxrwxrwx/ (បោះពុម្ព $9, $10, $11)'
bzcmp -> bzdiff
bzegrep -> bzgrep
bzfgrep -> bzgrep
bzless -> bzmore
lessfile -> បំពង់តិច
lsmod -> kmod
mt -> /etc/alternatives/mt
nc -> /etc/alternatives/nc
netcat -> /etc/alternatives/netcat
បើក -> openvt
pidof -> /sbin/killall5
rbash -> បាស
rnano -> ណាណូ
sh -> សញ្ញា
sh.distrib -> សញ្ញា

ការពន្យល់៖ កម្មវិធី awk គឺជាគូគំរូ ( លំនាំ) និងសកម្មភាព ( (សកម្មភាព)) ក៏ដូចជានិយមន័យនៃមុខងារកំណត់ដោយអ្នកប្រើប្រាស់។ គំរូ និងសកម្មភាពមើលទៅដូចនេះ៖ លំនាំ (សកម្មភាព) គំរូ ឬសកម្មភាពអាចត្រូវបានលុបចោល។ ក្នុងករណីទីមួយ សកម្មភាពនឹងត្រូវបានអនុវត្តនៅលើបន្ទាត់នីមួយៗ ហើយទីពីរ លទ្ធផលធម្មតាទៅកាន់អេក្រង់នឹងត្រូវបានអនុវត្ត ស្មើនឹងពាក្យបញ្ជា។(បោះពុម្ព). ពាក្យគន្លឹះទាំងនេះមិនអាចរួមបញ្ចូលជាមួយលំនាំផ្សេងទៀតបានទេ។.

ខ្សែអក្សរបញ្ចូលជាធម្មតាមានវាលដែលបំបែកដោយដកឃ្លា។ (ការកំណត់លំនាំដើមនេះអាចត្រូវបានផ្លាស់ប្តូរដោយប្រើអថេរដែលភ្ជាប់មកជាមួយ អេសឬជម្រើស -F កំណត់ព្រំដែន.) វាលត្រូវបានកំណត់ $1, $2, …; $0 សំដៅលើបន្ទាត់ទាំងមូល។

ឧទាហរណ៍លេខ 4

ដោយផ្អែកលើព័ត៌មានខាងលើ សូមក្រឡេកមើលឧទាហរណ៍មួយជាមួយនឹងការផ្លាស់ប្តូរសញ្ញាបំបែកលំនាំដើម - មើលបញ្ជីអ្នកប្រើប្រាស់ទាំងអស់ដោយគ្មានព័ត៌មានបន្ថែម។

root@debian៖ ~# awk -F ":" '(បោះពុម្ព $1)' /etc/passwd
ឫស
ដេមិន
ធុង
ស៊ីស
ធ្វើសមកាលកម្ម
ហ្គេម
បុរស

(ទិន្នផលពាក្យបញ្ជាត្រូវបានកាត់បន្ថយ)

ការពន្យល់៖ តាំងពីក្នុងឯកសារ /etc/passwdកំណត់ត្រាត្រូវបានរក្សាទុកក្នុងទម្រង់ " root:x:0:0:root:/root:/bin/bash", វា​ពិត​ជា​ឡូជីខល​ណាស់​ក្នុង​ការ​ជ្រើសរើស​សញ្ញា​សម្គាល់​ជា​សញ្ញា​បំបែក ហើយ​បង្ហាញ​វាល​ដំបូង​បំផុត ( $1 ) បន្ទាត់នីមួយៗ ( $0 ).

ឧទាហរណ៍លេខ 5

ទាំងអស់នៅក្នុងឯកសារដូចគ្នាជាមួយអ្នកប្រើប្រាស់ អ្នកអាចរាប់លេខរបស់ពួកគេ។

root@debian៖ ~# awk 'END (បោះពុម្ព NR)' /etc/passwd
25

ការពន្យល់៖ គំរូពិសេស ចាប់ផ្តើមនិង ចប់អាចត្រូវបានប្រើដើម្បីទទួលបានការគ្រប់គ្រង មុនពេលអានបន្ទាត់បញ្ចូលទីមួយ និងបន្ទាប់ពីអានបន្ទាត់បញ្ចូលចុងក្រោយរៀងៗខ្លួន។

Awk គឺជាអ្នកកែសម្រួលស្ទ្រីមជាមូលដ្ឋានដូចជា sed ។ អ្នកអាចបញ្ចូលអត្ថបទទៅក្នុងកម្មវិធីនេះ ហើយវាអាចរៀបចំវាតាមបន្ទាត់។ កម្មវិធីក៏អាចអានពីឯកសារផងដែរ។ Awk ក៏ជាភាសាសរសេរកម្មវិធីផងដែរ។ នេះមានន័យជាមូលដ្ឋានថា awk អាចធ្វើអ្វីគ្រប់យ៉ាងដែល sed អាចធ្វើបាន និងច្រើនទៀត។

មិនដូច sed ទេ awk អាចចងចាំបរិបទ ធ្វើការប្រៀបធៀប និងអ្វីៗជាច្រើនទៀតដែលភាសាសរសេរកម្មវិធីផ្សេងទៀតអាចធ្វើបាន។ ជាឧទាហរណ៍ វាមិនត្រូវបានកំណត់ចំពោះបន្ទាត់តែមួយទេ។ ដោយមានជំនាញត្រឹមត្រូវ វាអាចភ្ជាប់ខ្សែជាច្រើន។

ទម្រង់សាមញ្ញបំផុតនៃ awk មើលទៅដូចនេះ:

Awk "(សកម្មភាពខ្លះនៅទីនេះ)"

"Some_action_here" អាចជាកន្សោមសាមញ្ញមួយដើម្បីបោះពុម្ពលទ្ធផល ឬអ្វីដែលស្មុគស្មាញជាងនេះ។ វាក្យសម្ព័ន្ធគឺស្រដៀងនឹងភាសាសរសេរកម្មវិធី "C" ។ ឧទាហរណ៍សាមញ្ញ៖

Awk "(បោះពុម្ព $1, $3)"

មាន​ន័យ​ថា​បោះពុម្ព​ជួរ​ឈរ​ទី​មួយ និង​ទី​បី ដែល​ជួរ​ឈរ​មាន​ន័យ​ថា "វត្ថុ​ដែល​បំបែក​ដោយ​ចន្លោះ​ស"។ ចន្លោះពណ៌ស = ផ្ទាំង ឬចន្លោះ។

ឧទាហរណ៍ផ្ទាល់៖

បន្ទរ "1 2 3 4" | awk "(បោះពុម្ព $1,$3)" 1 3

ផ្នែកទីពីរ៖ តើ AWK អាចធ្វើអ្វីបាន?

គោលបំណងសំខាន់របស់ AWK ក្នុងជីវិតគឺដើម្បីរៀបចំការបញ្ចូលរបស់វាតាមបន្ទាត់មួយៗ។ កម្មវិធី awk ជាធម្មតាដំណើរការក្នុងរចនាប័ទ្ម

ប្រសិនបើអ្វីដែលអ្នកចង់ធ្វើមិនសមនឹងម៉ូដែលនេះ នោះ awk ប្រហែលជាមិនសមនឹងគំនិតរបស់អ្នកទេ។

វាក្យសម្ព័ន្ធធម្មតាដែលប្រើក្នុងការសរសេរកម្មវិធី awk អាចត្រូវបានពិពណ៌នាដូចខាងក្រោមៈ

គំរូ Awk (ពាក្យបញ្ជា)

នេះមានន័យថា

“សូមមើលបន្ទាត់បញ្ចូលនីមួយៗ ដើម្បីមើលថាតើមានលំនាំនៅទីនោះឬអត់។ ប្រសិនបើវានៅទីនោះ រត់អ្វីដែលនៅចន្លោះ ()"

អ្នកអាចរំលង SAMPLE ឬ Command

ប្រសិនបើអ្នកមិនបញ្ជាក់លំនាំទេ ពាក្យបញ្ជានឹងត្រូវបានអនុវត្តទៅគ្រប់បន្ទាត់។

ប្រសិនបើពាក្យបញ្ជាត្រូវបានលុបចោល នោះវាស្មើនឹងការបញ្ជាក់ (គ្រាន់តែបោះពុម្ពបន្ទាត់)៖

(បោះពុម្ព)

ឧទាហរណ៍ជាក់លាក់៖

Awk "/#/ (បោះពុម្ព "មានមតិយោបល់លើបន្ទាត់នេះ")" /etc/hosts

នឹងបោះពុម្ព "បន្ទាត់នេះមានមតិយោបល់" សម្រាប់គ្រប់បន្ទាត់ដែលមានយ៉ាងហោចណាស់មួយ "#" កន្លែងណាមួយនៅលើបន្ទាត់ក្នុង /etc/hosts

ការកែប្រែសម្រាប់ភាពច្បាស់លាស់

Awk "/#/ (បោះពុម្ព $0 ":\t មានមតិនៅលើបន្ទាត់នេះ)" /etc/hosts

ធាតុ "//" នៅក្នុងលំនាំគឺជាវិធីមួយដើម្បីបញ្ជាក់ការផ្គូផ្គង។ វាក៏មានវិធីផ្សេងទៀតដើម្បីកំណត់ថាតើខ្សែអក្សរត្រូវគ្នាដែរឬទេ។ ឧ.

Awk "$1 =="#" (បោះពុម្ព "បន្ទាត់ចាប់ផ្តើមដោយសញ្ញា")" /etc/hosts

នឹង​ផ្គូផ្គង​ជួរ​ដេក​ដែល​ជួរ​ឈរ​ដំបូង​គឺ "#" តែមួយ។ លំដាប់នៃតួអក្សរ "==" មានន័យថាការផ្គូផ្គងជាក់លាក់នៃជួរទីមួយទាំងមូល។

ការកែប្រែសម្រាប់ភាពច្បាស់លាស់៖

Awk "$1 =="#" (បោះពុម្ព $0 "\tline ចាប់ផ្តើមដោយ hash)" /etc/hosts

ម្យ៉ាងវិញទៀត ប្រសិនបើអ្នកចង់បានការផ្គូផ្គងផ្នែកនៃជួរឈរជាក់លាក់មួយ សូមប្រើសញ្ញា "~"

Awk "$1 ~ /#/ (បោះពុម្ព "កន្លែងណាមួយមានសញ្ញានៅក្នុងជួរទី 1")" /etc/hosts

សូមចងចាំថា ជួរទីមួយអាចនៅក្រោយកន្លែងពណ៌ស។

ការកែប្រែសម្រាប់ភាពច្បាស់លាស់៖

Awk "$1 ~ /#/ (បោះពុម្ព $0 "\tមានសញ្ញាមួយនៅត្រង់ជួរទី 1)" /etc/hosts

ការបញ្ចូល "#comment" នឹងត្រូវគ្នា។

ការបញ្ចូល "#comment" នឹងដូចគ្នាផងដែរ។

ប្រសិនបើអ្នកចង់បានការផ្គូផ្គងជាក់លាក់នៃ "ខ្សែអក្សរដែលចាប់ផ្តើមដោយពិតប្រាកដ # និងដកឃ្លា" អ្នកនឹងប្រើ

អាក់ "/^# / (ធ្វើអ្វីមួយ)"

ការប្រកួតជាច្រើន។

Awk នឹងដំណើរការលំនាំទាំងអស់ដែលត្រូវនឹងបន្ទាត់បច្ចុប្បន្ន។ ដូច្នេះប្រសិនបើយើងប្រើឧទាហរណ៍ខាងក្រោម

Awk " /// (បោះពុម្ព "មានមតិយោបល់") $1 =="#" (បោះពុម្ព "មតិយោបល់ក្នុងជួរទីមួយ") /^# / (បោះពុម្ព "មតិយោបល់នៅដើមដំបូង") " /etc/hosts

ធាតុចំនួន 3 នឹងត្រូវបានចេញសម្រាប់បន្ទាត់ដូចខាងក្រោម:

#នេះជាមតិ

ធាតុពីរសម្រាប់

# នេះ​ជា​មតិ​ចូល​បន្ទាត់

និងតែមួយគត់សម្រាប់

1.2.3.4 ឈ្មោះម៉ាស៊ីន # មតិចុងក្រោយ

ការតាមដានបរិបទ

មិនមែនខ្សែទាំងអស់ត្រូវបានបង្កើតស្មើគ្នាទេ បើទោះបីជាពួកវាមើលទៅដូចគ្នាក៏ដោយ។ ពេលខ្លះអ្នកចង់ធ្វើអ្វីមួយទៅខ្សែមួយអាស្រ័យលើបន្ទាត់ដែលមកមុនវា។

នេះជាឧទាហរណ៍រហ័សដែលបោះពុម្ពបន្ទាត់ "ADDR" ប្រសិនបើអ្នកមិននៅក្នុងផ្នែក "សម្ងាត់"

Awk " /secretstart/ (secretstart/ (secret=1) /ADDR/ ( if(secret==0) print $0) /* $0 គឺជាបន្ទាត់ពេញលេញ */ /secretend/ (secret=0)"

ខាងក្រោមនឹងបោះពុម្ពមាតិកាដែលមាន "ADDR" នៅខាងក្នុង លុះត្រាតែឃើញខ្សែអក្សរ "secretstart" ប៉ុណ្ណោះ។ ការបញ្ជាទិញបញ្ហា។ ឧទាហរណ៍ប្រសិនបើអ្នកសរសេរវាដូចនេះ៖

Awk " /ADDR/ (ប្រសិនបើ (secret==0) បោះពុម្ព $0) /* $0 គឺជាបន្ទាត់ពេញលេញ */ /secretstart/ (secret=1) /secretend/ (secret=0)"

និងផ្តល់ការបញ្ចូលដូចខាងក្រោម

ADDR a addr secretstart ADDR a secret addr ADDR មួយទៀត secret addr សម្ងាត់ទីបី ADDR secretend ADDR ធម្មតាផងដែរ

បន្ទាប់មកកម្មវិធីបន្ថែម "សម្ងាត់" ដំបូងនឹងត្រូវបានបោះពុម្ព។ ដែលបានផ្តល់ឱ្យថាឧទាហរណ៍ដើមនឹងលាក់អាថ៌កំបាំងទាំងពីរ។

ផ្នែកទីបី៖ អថេរពិសេស

យើងបាននិយាយរួចហើយអំពីវាក្យសម្ព័ន្ធ awk ធម្មតា។ ឥឡូវនេះសូមចាប់ផ្តើមមើលម៉ូដទាន់សម័យ។

awk មានខ្សែអក្សរដែលត្រូវគ្នា "ពិសេស"៖ " ចាប់ផ្តើម"ហើយ" ចប់"

សេចក្តីណែនាំ ចាប់ផ្តើមហៅម្តងមុនពេលអានជួរណាមួយពីទិន្នន័យ មិនដែលម្តងទៀតទេ។

សេចក្តីណែនាំ ចប់ហៅបន្ទាប់ពីបន្ទាត់ទាំងអស់ត្រូវបានអាន។ ប្រសិនបើឯកសារជាច្រើនត្រូវបានផ្តល់ឱ្យ នោះវាត្រូវបានហៅតែបន្ទាប់ពីឯកសារចុងក្រោយបំផុតបានបញ្ចប់។

ជាធម្មតាអ្នកនឹងប្រើ ចាប់ផ្តើមសម្រាប់ការចាប់ផ្តើមផ្សេងគ្នា និង ចប់សម្រាប់ការសង្ខេបឬការសម្អាត។

BEGIN ( maxerrors=3 ; logfile=/var/log/something ; tmpfile=/tmp/blah) ... ( blah blah blah ) /^header/ ( headercount += 1 ) END ( printf("ក្បាលសរុបត្រូវបានរាប់=% d\n", ចំនួនបឋមកថា);

ឧទាហរណ៍នេះនឹងរាប់ចំនួនដងដែល "បឋមកថា" លេចឡើងក្នុងឯកសារបញ្ចូល ហើយបោះពុម្ពសរុបបន្ទាប់ពីដំណើរការឯកសារទាំងមូលបានបញ្ចប់។

AWK ក៏មានតម្លៃពិសេសជាច្រើនទៀតដែលអ្នកអាចប្រើនៅក្នុងផ្នែក ( )។ ឧ.

បោះពុម្ព NF

នឹងផ្តល់ឱ្យអ្នកនូវចំនួនសរុបនៃជួរឈរ (ចំនួនវាល) ក្នុងជួរបច្ចុប្បន្ន។ FILENAMEនឹង​ជា​ឈ្មោះ​ឯកសារ​បច្ចុប្បន្ន ដោយ​បញ្ជាក់​ថា​ឈ្មោះ​ឯកសារ​ត្រូវ​បាន​បញ្ជូន​ទៅ awk ជាជាង​ប្រើ​បំពង់។

អ្នកមិនអាចផ្លាស់ប្តូរបានទេ។ NFដោយខ្លួនឯង។

ដូចគ្នាជាមួយនឹងអថេរ NRដែលប្រាប់អ្នកពីចំនួនជួរដែលអ្នកបានដំណើរការ។ ("ចំនួនកំណត់ត្រា" - ចំនួនកំណត់ត្រា)

មានអថេរពិសេសផ្សេងទៀត សូម្បីតែមួយដែលអ្នកអាចផ្លាស់ប្តូរនៅពាក់កណ្តាលកម្មវិធី។

ផ្នែកទី 4៖ ឧទាហរណ៍សាមញ្ញ Awk

ដើម្បី​បង្ហាញ​និង​ពង្រឹង​អ្វី​ដែល​បាន​និយាយ សូម​យើង​មើល​ឧទាហរណ៍​ជាក់លាក់​មួយ​ចំនួន។ សម្រាប់ពួកគេយើងនឹងត្រូវការឯកសារអត្ថបទតូចៗចំនួនបី។

សម្រាប់ឧទាហរណ៍ខាងក្រោម ចូរយើងបង្កើតឯកសារ field_data.txt ដែលមានខ្លឹមសារដូចខាងក្រោម៖

ផ្កាកុលាបមានពណ៌ក្រហម ពណ៌ស្វាយមានពណ៌ខៀវ ស្ករគឺផ្អែម ហើយអ្នកក៏ដូចគ្នាដែរ។

Echo -e "ផ្កាកុលាបមានពណ៌ក្រហម\nViolets មានពណ៌ខៀវ\nស្ករគឺផ្អែម\nហើយអ្នកក៏ដូចគ្នាដែរ"។ >field_data.txt

តោះបង្កើតឯកសារ letters.txt ដែលមានខ្លឹមសារដូចខាងក្រោម

A bb ccc dddd ggg hh i

នៅលើបន្ទាត់ពាក្យបញ្ជាអ្នកអាចធ្វើដូចនេះ:

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

ជាចុងក្រោយ ចូរយើងបង្កើតឯកសារ mail-data ដែលមានខ្លឹមសារដូចខាងក្រោម៖

អាមេលា 555-5553 [អ៊ីមែលការពារ] F Anthony 555-3412 [អ៊ីមែលការពារ]បេកគី ៥៥៥-៧៦៨៥ [អ៊ីមែលការពារ]វិក័យប័ត្រ 555-1675 [អ៊ីមែលការពារ] A Broderick 555-0542 [អ៊ីមែលការពារ] R Camilla 555-2912 [អ៊ីមែលការពារ] R Fabius 555-1234 [អ៊ីមែលការពារ] F Julie 555-6699 [អ៊ីមែលការពារ] F Martin 555-6480 [អ៊ីមែលការពារ]សាំយូអែល 555-3430 [អ៊ីមែលការពារ]ហ្សង់-ប៉ូល ៥៥៥-២១២៧ [អ៊ីមែលការពារ]

នេះអាចត្រូវបានធ្វើនៅលើបន្ទាត់ពាក្យបញ្ជាដូចនេះ:

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

គំរូសាមញ្ញ (គំរូ)

ប្រសិនបើយើងត្រូវការបន្ទាត់វែងជាងពីរតួអក្សរ ហើយយើងចង់ប្រើសកម្មភាពលំនាំដើម ( បោះពុម្ព) បន្ទាប់មកយើងទទួលបាន៖

Awk "ប្រវែង $0 > 2" letters.txt bb ccc dddd ggg hh

$0 គឺជាអថេរដែលភ្ជាប់មកជាមួយដែលមានខ្សែអក្សរ។

មុខងារសាមញ្ញ

ប្រសិនបើយើងមិនបញ្ជាក់លំនាំទេនោះ បន្ទាត់នីមួយៗនឹងត្រូវគ្នា។ សកម្មភាពតូចតាចមួយនឹងបោះពុម្ពបន្ទាត់នីមួយៗ៖

Awk "(បោះពុម្ព)" letters.txt a bb ccc dddd ggg hh i

ការប្រើប្រាស់មុខងារ ប្រវែងជាសកម្មភាពរបស់យើង យើងអាចទទួលបានប្រវែងនៃបន្ទាត់នីមួយៗ៖

Awk "( ប្រវែងបោះពុម្ព )" letters.txt 1 2 3 4 3 2 1

សកម្មភាពនេះអនុវត្តដោយគ្មានលក្ខខណ្ឌចំពោះជួរទាំងមូល។ យើងក៏អាចបញ្ជាក់រឿងនេះឱ្យច្បាស់ផងដែរ៖

Awk "( ប្រវែងបោះពុម្ព $0 )" letters.txt 1a 2bb 3ccc 4dddd 3ggg 2hh 1i

Awk មានការគ្រប់គ្រងពិសេសសម្រាប់ដំណើរការកូដមួយចំនួន មុនពេលការបញ្ចូលឯកសារចាប់ផ្តើម និងបន្ទាប់ពីការបំពេញឯកសារ។

Awk "BEGIN (បោះពុម្ព "HI") (បោះពុម្ព $0) END (បោះពុម្ព "BYE!")" letters.txt HI a bb ccc dddd ggg hh i BYE!

យើងអាចមាន ធាតុជាច្រើនទៀតគ្រប់គ្រងកំឡុងពេលបោះពុម្ពដោយប្រើ បោះពុម្ព.

Awk "BEGIN ( printf "%-10s %s\n", "ឈ្មោះ", "លេខ" \ 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 Samuel 555-3430 Jean-Paul 555-2127

ការរួមបញ្ចូលគ្នានៃគំរូនិងមុខងារ

ជា​ការ​ពិត​ណាស់ លំនាំ និង​មុខងារ​អាច​ត្រូវ​បាន​ផ្សំ​គ្នា ដូច្នេះ​មុខងារ​នឹង​ត្រូវ​បាន​អនុវត្ត​លុះត្រា​តែ​ខ្សែអក្សរ​ត្រូវ​គ្នា​នឹង​លំនាំ។

យើងអាចបោះពុម្ពប្រវែងបន្ទាត់ទាំងអស់ដែលវែងជាង 2 តួអក្សរ។

Awk "length($0) > 2 ( print length($0))" letters.txt 3 4 3

តាមពិតទៅ យើងមិនចាំបាច់ដាក់កម្រិត Awk ត្រឹមតែគំរូមួយទេ! យើង​អាច​មាន​ចំនួន​លំនាំ​តាម​អំពើ​ចិត្ត ដែល​កំណត់​ដោយ​សញ្ញា​ក្បៀស ឬ​បន្ទាត់​ថ្មី៖

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

វាលជាច្រើន។

Awk ត្រូវបានរចនាឡើងសម្រាប់ដំណើរការទិន្នន័យសាមញ្ញជាមួយនឹងវាលជាច្រើនក្នុងមួយជួរ។ សញ្ញាបំបែកវាលអាចត្រូវបានបញ្ជាក់ដោយគ្រាប់ចុច -F.

ឧទាហរណ៍នៃឯកសារដែលកំណត់ព្រំដែនគឺជាដកឃ្លា៖

Awk "( print )" field_data.txt ផ្កាកុលាបមានពណ៌ក្រហម ពណ៌ស្វាយមានពណ៌ខៀវ ស្ករគឺផ្អែម ហើយអ្នកក៏ដូចគ្នាដែរ។

ប្រសិនបើយើងបញ្ជាក់អ្នកបំបែកវាល យើងអាចបោះពុម្ពវាលទីពីរនៃបន្ទាត់នីមួយៗ៖

Awk -F " " "( បោះពុម្ព $2 )" field_data.txt គឺដូច្នេះ

យើងនឹងមិនទទួលបានកំហុសទេ ប្រសិនបើជួរដេកមិនមានវាលដែលត្រូវគ្នា យើងនឹងបង្ហាញបន្ទាត់ទទេ៖

Awk -F " " "( បោះពុម្ព $4 )" field_data.txt អ្នក។

ដោយសារសញ្ញាបំបែកលំនាំដើមគឺជាចន្លោះមួយ ពាក្យបញ្ជាពីមុននឹងផ្តល់លទ្ធផលដូចគ្នាដោយមិនប្រើជម្រើស -F ។សម្រាប់​ឧទាហរណ៍​ដែល​មាន​ន័យ​ជាង​នេះ ចូរ​យើង​បង្កើត​ឯកសារ​មួយ​ទៀត។ rates.txtជាមួយនឹងខ្លឹមសារដូចខាងក្រោម៖

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

ឥឡូវនេះយើងបង្ហាញជាសញ្ញាបំបែក , (សញ្ញាក្បៀស) ហើយបង្ហាញមាតិកានៃជួរទីពីរ៖

Awk -F "," "(បោះពុម្ព $2 )" rates.txt Humphrey Zora Oldone Anton Bertrand

កន្សោមកំណត់ព្រំដែនត្រូវបានបកស្រាយថាជាកន្សោមធម្មតា។

Awk -F "((so)?are|is) " "(print "Field 1: " $1 "\nField 2: " $2)" field_data.txt Field 1: Roses Field 2: red, Field 1: Violets Field 2 :blue, Field 1: Sugar Field 2: sweet, Field 1: And Field 2: you.

កន្សោមធម្មតា។

លំនាំអាចជាកន្សោមធម្មតា មិនមែនគ្រាន់តែជាមុខងារដែលភ្ជាប់មកជាមួយនោះទេ។

យើង​អាច​ប្រើ​កន្សោម​ធម្មតា​ដើម្បី​ស្វែងរក​ពាក្យ​ទាំងអស់​ក្នុង​ពិភព​យូនីក​ដោយ​មាន​ស្រៈ 5 ជាប់​គ្នា។

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

បញ្ជូនអថេរទៅកម្មវិធី

ជម្រើស -vសម្រាប់ Awk អនុញ្ញាតឱ្យយើងបញ្ជូនអថេរទៅក្នុងកម្មវិធី។ ឧទាហរណ៍ យើងអាចប្រើវាសម្រាប់កូដថេរ។

Awk -v pi = 3.1415 "BEGIN (បោះពុម្ព pi)" 3.1415

យើងក៏អាចប្រើផងដែរ។ -vដើម្បីឆ្លងកាត់អថេរ Bash ជាអថេរ Awk

Awk -v user=$USER "BEGIN (អ្នកប្រើប្រាស់បោះពុម្ព)" mial

កន្សោមប្រសិនបើផ្សេងទៀត។

ប្រសិនបើ - ផ្សេងទៀត។កន្សោមនៅក្នុង Awk មើលទៅដូចនេះ៖

ប្រសិនបើ (លក្ខខណ្ឌ) រាងកាយ - បន្ទាប់មក

ឧទាហរណ៍៖

បោះពុម្ព "1\n2\n3\n4" | awk \"( \ if ($1 %2 == 0) បោះពុម្ព $1 "គឺស្មើ"; \ else print $1 "គឺសេស" \)" 1 គឺសេស 2 គឺសូម្បីតែ 3 គឺសេស 4 គឺគូ

វដ្ត

Awk រួមបញ្ចូលកន្សោមរង្វិលជុំជាច្រើន៖ ខណៈពេលដែល, ធ្វើខណៈពេលដែលនិង សម្រាប់.

ពួកគេមានវាក្យសម្ព័ន្ធ C ដែលរំពឹងទុក។

Awk\"BEGIN(\i=0;\while(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

សម្រាប់ក៏អាចកំណត់រង្វិលជុំតាមរយៈគ្រាប់ចុចអារេ ដែលនឹងត្រូវបានពិភាក្សានៅពេលក្រោយ។

ផ្នែកទី ៥៖ មុខងារហៅទូរសព្ទ

សមាសធាតុបន្ទាប់របស់ AWK គឺជាមុខងារពិសេសទាំងអស់របស់វា។

AWK មានលក្ខណៈពិសេសដែលនឹងធ្វើឱ្យអ្នកសរសេរកម្មវិធី C ជាមធ្យមសប្បាយចិត្តណាស់។ នៅទីនេះមានរឿងដូចជា sin()/cos()/tan(), rand(), index(), sprintf(), tolower(), system()

មុខងារត្រូវបានដាក់ជាក្រុម ហើយអាចមើលបានដូចខាងក្រោម៖

គណិតវិទ្យា

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

ពួកគេនិយាយដោយខ្លួនឯង យ៉ាងហោចណាស់ខ្ញុំចង់គិតដូច្នេះ។

Awk -v pi=3.1415 "BEGIN (បោះពុម្ព 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

កម្មវិធីអាចបង្កើតលេខចៃដន្យក្នុងជួរ (0, 1)។

តាមលំនាំដើម Awk ចាប់ផ្តើមពីការចាប់ផ្តើមដូចគ្នា (គ្រាប់ពូជ) សម្រាប់ Awk ។ ការរត់ពាក្យបញ្ជានេះពីរដងក្នុងមួយជួរនឹងផ្តល់លទ្ធផលដូចគ្នា៖

Awk "BEGIN (print rand(); print rand())" 0.237788 0.291066

ដើម្បីកំណត់ការចាប់ផ្តើម (គ្រាប់ពូជ) អ្នកអាចប្រើមុខងារ srand:

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

មុខងារ intត្រឡប់ "ចំនួនគត់ជិតបំផុតទៅ x រវាង x និងសូន្យ ជាមួយនឹងការបោះចោលសូន្យនាំមុខ។"

Awk "BEGIN (បោះពុម្ព "int(0.9) = "int(0.9); បោះពុម្ព "int(-0.9) = "int(-0.9))" int(0.9) = 0 int(-0.9) = 0

ការរៀបចំខ្សែអក្សរ

  • សន្ទស្សន៍()នឹងប្រាប់អ្នកថាតើ ហើយប្រសិនបើដូច្នេះនៅកន្លែងណា ខ្សែអក្សរកើតឡើងនៅក្នុងខ្សែអក្សររង។
  • ប្រកួត()ស្រដៀងគ្នា ប៉ុន្តែដំណើរការសម្រាប់កន្សោមធម្មតា។
  • sprintf()ផ្តល់ឱ្យអ្នកនូវវិធីដើម្បីធ្វើទ្រង់ទ្រាយលទ្ធផល និងធ្វើការបំប្លែងតាមវិធីនេះ។ នេះគួរតែស្គាល់អ្នកដែលធ្លាប់ប្រើ printf() ជាមួយ C. ឧទាហរណ៍។
newstring=sprintf("មួយ​គឺ​ជា​លេខ %d, ពីរ​គឺ​ជា​ខ្សែ​អក្សរ %s\n", មួយ, ពីរ);

"បោះពុម្ពខ្សែអក្សរថ្មី។%d
"" និយាយថា "បោះពុម្ពតម្លៃដែលត្រូវនឹងខ្ញុំជាលេខទសភាគ"%s

" និយាយថា "បោះពុម្ពតម្លៃដែលត្រូវនឹងខ្ញុំជាខ្សែអក្សរ"

ទាំងនោះ។ ប្រសិន​បើ​អ្នក​ចង់​ភ្ជាប់​ពីរ​បន្ទាត់​ដោយ​មិន​មាន​ការ​បំបែក​នោះ វិធី​មួយ​នឹង​ត្រូវ​ប្រើ

  • Newstring=sprintf("%s%s", មួយ, ពីរ)ប្រវែង ()

មុខងារ គ្រាន់តែផ្តល់ឱ្យអ្នកនូវវិធីងាយស្រួលក្នុងការរាប់ចំនួនតួអក្សរក្នុងបន្ទាត់មួយ ប្រសិនបើអ្នកត្រូវការវា។ substr(s,m,n) នឹង​ត្រឡប់​ខ្សែអក្សរ​រង​ចូល- តួអក្សរចាប់ផ្តើមពីទីតាំង រាប់ចាប់ពី 1 ។

Awk "(បោះពុម្ព $1, substr($1, 2, 3))" field_data.txt Roses ose Violets iol Sugar uga And nd

សន្ទស្សន៍(s, t)ត្រឡប់ 'ទីតាំងនៅក្នុង ដែលបន្ទាត់កើតឡើង tឬ 0 ប្រសិនបើវាមិនកើតឡើង។`

គំរូសម្រាប់លិបិក្រមមិនមែនជាកន្សោមធម្មតាទេ។

Awk "( បោះពុម្ព $1, index($1, "s") )" field_data.txt Roses 3 Violets 7 Sugar 0 និង 0

ការប្រកួត(s, r)ត្រឡប់ទីតាំងនៅក្នុង ដែលកន្សោមធម្មតាកើតឡើង rឬ 0 ប្រសិនបើវាមិនកើតឡើង។ អថេរ RSTARTនិង ប្រវែងត្រូវបានកំណត់ទៅទីតាំង និងប្រវែងនៃខ្សែដែលត្រូវគ្នា។

ការប្រកួត- ថាម៉េច សន្ទស្សន៍លើកលែងតែគំរូគឺជាកន្សោមធម្មតា។

Awk "( print $1, match($1, "") )" field_data.txt Roses 3 Violets 7 Sugar 1 And 0 # "Find three or more repeating letters" awk "( match($1, "(3)"); print $1, "\tpattern start:", RSTART, "\tpattern end:", RLENGTH )" letters.txt a pattern start: 0 pattern end: -1 bb pattern start: 0 pattern end: -1 ccc pattern start: 1 pattern បញ្ចប់៖ 3 dddd pattern start: 1 pattern end: 3 ggg pattern start: 1 pattern end: 3 hh pattern start: 0 pattern end: -1 i pattern start: 0 pattern end: -1

បំបែក (s, a, fs)បំបែកខ្សែអក្សរទៅជាអារេនៃធាតុ a, a, …, a និង ត្រឡប់ នឹង​ត្រឡប់​ខ្សែអក្សរ​រង​ចូល.

ការបែងចែកត្រូវបានធ្វើឡើងដោយការបញ្ចេញមតិធម្មតា។ fsឬជាមួយឧបករណ៍បំបែកវាល អេស, ប្រសិនបើ fsមិនត្រូវបានផ្តល់ឱ្យ។ ខ្សែអក្សរទទេជាឧបករណ៍បំបែកវាលបំបែកខ្សែអក្សរទៅជាអារេនៃធាតុដោយតួអក្សរ។

Awk "BEGIN ( print split("It-was_the-best_of-times", output_array, "[-_]"), output_array, output_array )" 6 គឺល្អបំផុត

រង (r, t, s)ជំនួសដោយ tការកើតឡើងដំបូងនៃការបញ្ចេញមតិធម្មតា។ rនៅក្នុងបន្ទាត់ . ប្រសិនបើ s មិនត្រូវបានផ្តល់ឱ្យ, បន្ទាប់មកប្រើ $0

គឺជាខ្សែដែលការជំនួសកើតឡើង។ ជំនួសឱ្យការត្រឡប់ខ្សែថ្មីជាមួយនឹងការជំនួសដែលបានធ្វើ ចំនួននៃការជំនួសដែលបានធ្វើ (0 ឬ 1) នឹងត្រូវបានត្រឡប់មកវិញ។

Awk "BEGIN (s = "វាជាពេលវេលាល្អបំផុត វាជាពេលវេលាដ៏អាក្រក់បំផុត"; \ print "Num. matches replaced:", sub("times", "gifs", s); \ print s )" លេខ ការ​ប្រកួត​ត្រូវ​បាន​ជំនួស​: 1 វា​គឺ​ជា​ការ​ល្អ​បំផុត​នៃ gifs វា​ជា​ពេល​វេលា​ដ៏​អាក្រក់​បំផុត​

gsubធ្វើដូចគ្នានឹង រងលើកលែងតែរាល់ការកើតឡើងនៃកន្សោមធម្មតាត្រូវបានជំនួស។ រងនិង gsubត្រឡប់ចំនួននៃការជំនួស។

Awk "BEGIN (s = "វាជាពេលវេលាល្អបំផុត វាជាពេលវេលាដ៏អាក្រក់បំផុត"; \ print "Num. matches replaced:", gsub("times", "cats", s); \ print s)" លេខ ការផ្គូផ្គងជំនួស៖ 2 វាល្អបំផុតសម្រាប់ឆ្មា វាអាក្រក់បំផុតនៃឆ្មា sprintf sprintf(fmt, expr, ...) ត្រឡប់ខ្សែអក្សរដែលមកពីការធ្វើទ្រង់ទ្រាយ expr ... យោងទៅតាមទម្រង់ printf(3) fmt awk "BEGIN ( x = sprintf("[%8.3f]", 3.141592654); បោះពុម្ព x )" [ 3.142]

មុខងារកម្រិតប្រព័ន្ធ

ប្រព័ន្ធ()អនុញ្ញាតឱ្យអ្នកហៅឯកសារដែលអាចប្រតិបត្តិបានណាមួយដែលមានសក្តានុពលនៅលើប្រព័ន្ធ។ កម្មវិធីគោលដៅអាចស្ថិតនៅក្នុងរបស់អ្នក។ $PATHឬអ្នកអាចបញ្ជាក់វាដោយប្រើផ្លូវដាច់ខាត។

ឧទាហរណ៍គួរឱ្យខ្លាច

ប្រព័ន្ធ("rm -rf $HOME");

ប្រព័ន្ធ("/ធុង/សម្លាប់ 1")

បើ​អ្នក​ចង់​ធ្វើ​រឿង​ស្មុគស្មាញ​ជាង​នេះ អ្នក​ប្រហែល​ជា​នឹង​បញ្ចប់​ការ​ធ្វើ​អ្វី​មួយ​ដូច​ជា

Sysstring=sprintf("ពាក្យបញ្ជាមួយចំនួន %s %s", arg1, arg2);

ប្រព័ន្ធ (ប្រព័ន្ធ)បិទ () ជា​លក្ខណៈ​សំខាន់​មួយ​ដែល​ច្រើន​តែ​ត្រូវ​បាន​គេ​មើល​រំលង។ នេះ​ប្រហែល​ជា​ដោយ​សារ​មិន​មាន​ការ​ហៅ​ច្បាស់​លាស់បើក () ប្រព័ន្ធ (ប្រព័ន្ធ)នោះហើយជាមូលហេតុដែលមនុស្សមិនគិតពីបញ្ហាប្រឈម

. ហើយសម្រាប់គោលបំណងភាគច្រើនវាមិនចាំបាច់ទេ។ ប៉ុន្តែអ្នកត្រូវតែធ្វើដូចនេះ ប្រសិនបើអ្នកកំពុងដោះស្រាយជាមួយឯកសារលទ្ធផលច្រើនជាងមួយ។

Awk ផ្តល់ឱ្យអ្នកនូវសមត្ថភាពក្នុងការបើកឯកសារបំពានភ្លាមៗ។ ឧទាហរណ៍

/^file/ (បោះពុម្ព $3 >> $2)

គួរតែយកបន្ទាត់ "file output here-is-a-word" បើកឯកសារ "output" ហើយបោះពុម្ព "here-is-a-word" ចូលទៅក្នុងវា។

AWK គឺ "ឆ្លាត" ដែលវាតាមដានឯកសារដែលអ្នកបើក ហើយទុកវាឱ្យបើក។ វាសន្មត់ថាប្រសិនបើអ្នកបើកឯកសារម្តង អ្នកទំនងជានឹងធ្វើវាម្តងទៀត។ ជាអកុសល នេះមានន័យថា ប្រសិនបើអ្នកបើកឯកសារច្រើន អ្នកអាចនឹងអស់ឯកសារពិពណ៌នា។ ដូច្នេះនៅពេលដែលអ្នកដឹងថាអ្នកបានបញ្ចប់ជាមួយឯកសារមួយ សូមបិទវា។ ដូច្នេះ ដើម្បីកែលម្អឧទាហរណ៍ខាងលើ អ្នកគួរតែប្រើអ្វីមួយដូចជាបន្ទាត់ខាងក្រោម៖

/^file/ (ប្រសិនបើ ($2 != oldfile) ( close(oldfile)); បោះពុម្ព $3 >> $2 ; oldfile = $2;)

ផ្នែកទីប្រាំមួយ៖ អារេ

គំនិតអារេ

យើងបានមើលអថេរជាឈ្មោះដែលមានតម្លៃរួចហើយ។ អារេគឺជាផ្នែកបន្ថែមនៃអថេរ។ អារេគឺជាអថេរដែលមានតម្លៃច្រើនជាងមួយ។ ពួកវាអាចមានតម្លៃលើសពីមួយ ព្រោះតម្លៃនីមួយៗមានលេខរៀងៗខ្លួន។

ប្រសិនបើអ្នកត្រូវការតម្លៃបី អ្នកអាចនិយាយថា៖

តម្លៃ 1 = "មួយ"; តម្លៃ 2 = "ពីរ"; តម្លៃ 3 = "បី";

ឬអ្នកអាចប្រើ

ឧទាហរណ៍ទីមួយគឺអថេរបីផ្សេងគ្នាដែលមានឈ្មោះផ្ទាល់ខ្លួនរបស់ពួកគេ (ដែលខុសគ្នាដោយតួអក្សរមួយ) ។ ឧទាហរណ៍ទីពីរគឺជាអារេដែលមានអថេរមួយ ប៉ុន្តែមានតម្លៃជាច្រើន ដែលនីមួយៗមានលេខរៀងៗខ្លួន។

នៅពេលប្រើអថេរជាអារេ អ្នកត្រូវតែបញ្ចូលតម្លៃក្នុងតង្កៀបការ៉េជានិច្ច។ អ្នកអាចជ្រើសរើសឈ្មោះណាមួយសម្រាប់អថេរអារេ ប៉ុន្តែចាប់ពីពេលនេះតទៅឈ្មោះនោះអាចប្រើបានសម្រាប់តែអារេប៉ុណ្ណោះ។ អ្នក​មិន​អាច​ធ្វើ​អ្វី​ដែល​មាន​ន័យ

តម្លៃ = "មួយ"; តម្លៃ = "តម្លៃថ្មី";

ទោះយ៉ាងណាក៏ដោយ អ្នកអាចកំណត់តម្លៃឡើងវិញ ដូចដែលអ្នកចង់បានសម្រាប់អថេរធម្មតា។ ទាំងនោះ។ ខាងក្រោមនេះគឺត្រឹមត្រូវ៖

តម្លៃ = "1"; តម្លៃបោះពុម្ព; តម្លៃ = "មួយ"; តម្លៃបោះពុម្ព;

អ្វីដែលគួរឱ្យចាប់អារម្មណ៍នោះគឺថា មិនដូចភាសាផ្សេងទៀតទេ អ្នកមិនត្រូវបានបង្ខំឱ្យប្រើតែលេខទេ។ នៅក្នុងឧទាហរណ៍ខាងលើ ,, ត្រូវបានបកស្រាយថាជា [“១”], [“២”], [“៣”]។ នេះមានន័យថា អ្នកក៏អាចប្រើខ្សែអក្សរផ្សេងទៀតជាអ្នកកំណត់អត្តសញ្ញាណ និងចាត់ចែងអារេស្ទើរតែដូចជាមូលដ្ឋានទិន្នន័យជួរឈរតែមួយ។ ឈ្មោះផ្លូវការសម្រាប់នេះគឺ "អារេពាក់ព័ន្ធ" ។

លេខ["មួយ"]=1; លេខ["ពីរ"]=2; លេខបោះពុម្ព["មួយ"]; value="ពីរ"; print numbers; value=$1; if(numbers = ""){ print "no such number"; } !}

ពេលណា និងរបៀបប្រើអារេ

វាអាចមានករណីផ្សេងៗដែលអ្នកអាចជ្រើសរើសប្រើអារេ។ មនុស្សមួយចំនួននៅពេលធ្វើការជាមួយ awk ធ្វើដោយគ្មានអារេអ្វីទាំងអស់។ ប៉ុន្តែនេះមិនមែនជាទីតាំងត្រឹមត្រូវទាំងស្រុងនោះទេ៖ សម្រាប់អារេមានអថេរពិសេសដែលឧទាហរណ៍បង្ហាញទំហំរបស់វា (ចំនួនតម្លៃក្នុងអារេ) មានរចនាសម្ព័ន្ធងាយស្រួលសម្រាប់រាប់សមាជិកអារេ ហើយមុខងារមួយចំនួនត្រឡប់តម្លៃ។ ក្នុងទម្រង់ជាអារេ។ យ៉ាង​ណា​ក៏​ដោយ សូម​មើល​ឧទាហរណ៍​មួយ​ចំនួន​ដែល​អាច​នឹង​មាន​ប្រយោជន៍។

ការរក្សាទុកព័ត៌មានសម្រាប់ការប្រើប្រាស់នៅពេលក្រោយ

នៅពេលប្រើ awk នៅក្នុងស្គ្រីបសែលធំ អ្នកអាចរក្សាទុកព័ត៌មានទៅឯកសារបណ្តោះអាសន្ន។ ប៉ុន្តែអ្នកអាចរក្សាទុកពាក្យដែលអ្នកត្រូវការទៅក្នុងអង្គចងចាំ ហើយបន្ទាប់មកបោះពុម្ពវាទាំងអស់នៅចុងបញ្ចប់ ដែលនឹងលឿនជាងការប្រើឯកសារបណ្តោះអាសន្ន។

/special/(savewords=$2; lnum+=1;) END (រាប់=0; while(savewords != "") (ចំនួន print,savewords; count+=1; ))

ជំនួសឱ្យការបង្ហាញពាក្យសាមញ្ញ អ្នកអាចប្រើផ្នែក END ដើម្បីដំណើរការបន្ថែមណាមួយដែលអ្នកប្រហែលជាត្រូវការ មុនពេលបង្ហាញពួកវា។

ប្រសិនបើអ្នកចង់កំណត់លិបិក្រមតែមួយគត់ចំពោះតម្លៃ (ដើម្បីជៀសវាងការស្ទួន) ជាទូទៅអ្នកអាចយោងទៅលើតម្លៃរបស់ពួកគេតាមជួររបស់ពួកគេផ្ទាល់។ ឬឧទាហរណ៍ រក្សាទុកអារេដែលមានជួរទី 3 ធ្វើលិបិក្រមដោយតម្លៃដែលត្រូវគ្នាក្នុងជួរទី 2 ។

( threecol[$2]=$3 ) END (សម្រាប់ (v in threecol) ( print v, threecol[v] ) )

អារេ និងបំបែក()

ហេតុផលចម្បងផ្សេងទៀតដើម្បីប្រើអារេគឺប្រសិនបើអ្នកចង់ធ្វើវាលរង។ ចូរនិយាយថាអ្នកមានជួរដែលមានការបែងចែកធំ ៗ និងផ្នែកតូចៗជាច្រើន។ ម្យ៉ាងវិញទៀត វាលកម្រិតកំពូលត្រូវបានបំបែកដោយដកឃ្លា ប៉ុន្តែបន្ទាប់មកអ្នកទទួលបានពាក្យតូចៗដែលបំបែកដោយសញ្ញា។

នេះគឺជាអថេរ:field:ប្រភេទបន្ទាត់ វាអាចមានច្រើន:ប្រភេទ:តម្លៃនៅទីនេះ

ក្នុងឧទាហរណ៍ខាងលើ វាលទីបួនដែលបំបែកដោយចន្លោះមួយ មានវាលរងដែលបំបែកដោយសញ្ញា។ ឥឡូវនេះ ចូរនិយាយថាអ្នកចង់ដឹងពីតម្លៃនៃវាលរងទីពីរនៅក្នុងវាលធំទីបួន។ វិធីមួយដើម្បីធ្វើវាគឺហៅ awks ពីរដែលតភ្ជាប់ដោយបំពង់មួយ៖

Awk "(បោះពុម្ព $4)" | awk -F: "(បោះពុម្ព $2)"

វិធីមួយទៀតគឺដើម្បីផ្លាស់ប្តូរតម្លៃនៃ "FS" ភ្លាមៗដែលមានឧបករណ៍បំបែកវាល (តាមមើលទៅវាមិនដំណើរការជាមួយការអនុវត្ត awk ទាំងអស់ទេ)៖

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

ប៉ុន្តែអ្នកក៏អាចធ្វើដូចនេះជាមួយ arrays ដោយប្រើមុខងារ split() ដូចនេះ៖

Awk "(បន្ទាត់ថ្មី=$4; បំបែក(បន្ទាត់ថ្មី វាលរង":"); វាលរងបោះពុម្ព) "

ក្នុងករណីនេះ ការប្រើអារេគឺជាវិធីសាមញ្ញបំផុត ហើយប្រហែលជាវិធីឆើតឆាយបំផុតដើម្បីធ្វើវា។

ដូច្នេះ Awk ផ្តល់នូវរចនាសម្ព័ន្ធទិន្នន័យចំនួនកំណត់។ បន្ថែមពីលើអថេរ មាត្រដ្ឋាន និងខ្សែអក្សរ ភាសាមានរចនាសម្ព័ន្ធទិន្នន័យដ៏ធំដែលភ្ជាប់មកជាមួយ។ ទោះបីជាត្រូវបានគេហៅថា "អារេ" ជាផ្លូវការក៏ដោយ រចនាសម្ព័ន្ធនេះគឺពិតជាអារេដែលជាប់ទាក់ទងគ្នា ស្រដៀងទៅនឹងរចនាសម្ព័ន្ធទិន្នន័យ dict នៅក្នុង Python ។

អារេមិនចាំបាច់ចាប់ផ្តើមទេ។ អ្នកគ្រាន់តែអាចចាប់ផ្តើមកំណត់តម្លៃ។ ចំណាំថាគ្រាប់ចុចអាចជាលេខ ឬខ្សែអក្សរ។

Awk "BEGIN ( \ a = 1.1; \ a = 0; \ a["DOG"] = "CAT"; \ print a, a, a["DOG"] \)" 1.1 0 CAT

Awk នឹងមិនបោះពុម្ពអថេរដោយគ្មានលិបិក្រមទេ៖

Awk "BEGIN ( \a["DOG"] = "CAT"; \print a\)" awk: cmd. line:3: fatal: ព្យាយាមប្រើអារេ `a” នៅក្នុងបរិបទមាត្រដ្ឋាន

ទោះបីជាយើងអាចរង្វិលជុំដោយគន្លឹះដោយប្រើ សម្រាប់:

Awk "BEGIN ( \ a = 1.1; \ a = 0; \ a["DOG"] = "CAT"; \ for(k in a) print(a[k]) \)" CAT 0 1.1

ផ្នែកទីប្រាំពីរ៖ AWK និងសែល (sh/ksh/bash/csh)

ពេលខ្លះមុខងាររបស់ AWK ប្រហែលជាមិនគ្រប់គ្រាន់ទេ។ ក្នុងករណីនេះ អ្នកអាចបញ្ចូល awk ទៅក្នុងស្គ្រីបសែលរបស់អ្នក។ ខាង​ក្រោម​នេះ​គឺ​ជា​ឧទាហរណ៍​មួយ​ចំនួន​នៃ​របៀប​ដែល​វា​អាច​ត្រូវ​បាន​ធ្វើ។

ការសន្និដ្ឋានសាមញ្ញ

ពេលខ្លះអ្នកចង់ប្រើ awk គ្រាន់តែជាទម្រង់ formatter ហើយបោះចោលលទ្ធផលដោយផ្ទាល់ទៅអ្នកប្រើប្រាស់

ចំណាំ៖ ចំណាំថានៅក្នុងស្គ្រីប សម្រង់តែមួយត្រូវបានពង្រីក (មិនជាប់គ្នា) ហើយរវាងគូដែលបានពង្រីកទាំងពីរនៃសម្រង់តែមួយមានអថេរ $1 (ទីពីរ) ដែលក្នុងករណីនេះគឺជាអាគុយម៉ង់ស្គ្រីប ខណៈដែល $1 គឺជាផ្នែកនៃវាក្យសម្ព័ន្ធ $1 (មានន័យថាវាលទីមួយក្នុងជួរ)។

#!/bin/sh ខណៈ [ "$1" !="" ] ; ធ្វើ awk -F: "$1 == ""$1"" (បោះពុម្ព $1,$3) " /etc/passwd shift done

កំណត់អថេរសែលទិន្នផល awk

ពេលខ្លះយើងចង់ប្រើ awk សម្រាប់វិធីរហ័សដើម្បីកំណត់តម្លៃនៃអថេរ។ ដោយប្រើប្រធានបទ passwd យើងមានវិធីមួយដើម្បីស្វែងរកសែលសម្រាប់អ្នកប្រើប្រាស់ ហើយមើលថាតើវាស្ថិតនៅក្នុងបញ្ជីសែលផ្លូវការដែរឬទេ។

ជាថ្មីម្តងទៀត សូមកត់សម្គាល់ពីរបៀបដែលសម្រង់តែមួយត្រូវបានបិទនៅក្នុងកន្សោម awk បន្ទាប់ពីសម្រង់បិទ (ទីពីរ) $1 គឺជាអថេរដែលត្រូវបានបញ្ជូនតម្លៃនៃអាគុយម៉ង់ទីមួយទៅស្គ្រីប មិនមែនជាផ្នែកមួយនៃវាក្យសម្ព័ន្ធ awk ទេ។

#!/bin/sh user="$1" ប្រសិនបើ [ "$user" =="" ] ; បន្ទាប់មកអេកូ ERROR: ត្រូវការឈ្មោះអ្នកប្រើប្រាស់ ; ចេញ; fi usershell=`awk -F: "$1 == ""$1"" (បោះពុម្ព $7) " /etc/passwd` grep -l $usershell /etc/shells ប្រសិនបើ [$? -ne 0] ; បន្ទាប់មកអេកូ កំហុស៖ សែល $usershell សម្រាប់អ្នកប្រើប្រាស់ $user មិននៅក្នុង /etc/shells fi

ជម្មើសជំនួសផ្សេងទៀត៖

# មើល "man regex" usershell=`awk -F: "/^"$1":/ (បោះពុម្ព $7) " /etc/passwd` echo $usershell; # មានតែ awk ទំនើបទេដែលទទួលយក -v. អ្នកប្រហែលជាត្រូវប្រើ "nawk" ឬ "gawk" usershell2=`awk -F: -v user=$1 "$1 == user (បោះពុម្ព $7)" /etc/passwd` echo $usershell2;

ការពន្យល់ពីវិធីសាស្រ្តបន្ថែមខាងលើទុកជាកិច្ចការផ្ទះសម្រាប់អ្នកអាន :)

ផ្ទេរទិន្នន័យទៅ awk តាមរយៈបំពង់

ពេលខ្លះអ្នកចង់ដាក់ awk ជាតម្រងទិន្នន័យ នៅក្នុងកម្មវិធីធំមួយ ឬជាពាក្យបញ្ជាមួយជួរដែលបានបញ្ចូលទៅក្នុងប្រអប់បញ្ចូលសែល។ ឧទាហរណ៍នៃពាក្យបញ្ជាបែបនេះនៅក្នុងស្គ្រីប (បញ្ជីនៃឯកសារកំណត់ហេតុម៉ាស៊ីនមេបណ្តាញត្រូវបានបញ្ជូនជាអាគុយម៉ង់ទៅស្គ្រីប ដោយសារការកត់ត្រាអាចប្ដូរតាមបំណង ហើយកំណត់ហេតុអាចមានរចនាសម្ព័ន្ធផ្សេងគ្នា ដើម្បីដំណើរការក្នុងករណីជាក់លាក់ ពាក្យបញ្ជាអាចត្រូវការ ដែលត្រូវកែតម្រូវ)៖

#!/bin/sh grep -h " /index.html" $* | awk -F\" "(បោះពុម្ព $4)" | តម្រៀប -u

  1. អត្ថបទគួរឱ្យចាប់អារម្មណ៍ខ្ញុំចង់អរគុណអ្នកសម្រាប់ការខិតខំប្រឹងប្រែងរបស់អ្នក។

    ខ្ញុំបានរកឃើញថាវាមិនត្រឹមត្រូវ។ ប្រសិនបើអ្នកប្រតិបត្តិបន្ទាត់ពីឧទាហរណ៍

    Awk -F " " "( បោះពុម្ព $2 )" field_data.txt

    វា​នឹង​ចេញ​លទ្ធផល​ដូច​គ្នា។

    Awk "( បោះពុម្ព $2 )" field_data.txt

    លទ្ធផលគឺជាឧទាហរណ៍ជាមួយ -Fមិនបានពិពណ៌នាល្អ។