Ինչպես զանգահարել արտաքին ծրագիր՝ օգտագործելով awk


Ներածություն

Awk-ը տեքստի մշակման հզոր գործիք է, որը կարող է օգտագործվել տարբեր առաջադրանքների ավտոմատացման համար, ինչպիսիք են տվյալների մանիպուլյացիան, զտումը և հաշվետվությունը: awk-ի հետաքրքիր առանձնահատկություններից մեկը արտաքին ծրագրերը սկրիպտից ներս կանչելու կարողությունն է: Այս հոդվածում մենք կուսումնասիրենք, թե ինչպես կարելի է զանգահարել արտաքին ծրագիր՝ օգտագործելով awk:

Հասկանալով System() ֆունկցիան

System() ֆունկցիան օգտագործվում է awk-ից արտաքին հրամաններ կատարելու համար: system() ֆունկցիայի շարահյուսությունը հետևյալն է

system(command)

Հրամանի արգումենտը արտաքին հրաման է, որը մենք ցանկանում ենք կատարել: Երբ system() ֆունկցիան կատարվում է, awk-ը հրամանի արգումենտն է փոխանցում shell-ին՝ կատարման համար: shell-ն այնուհետև կատարում է հրամանը և վերադարձնում է ելքի կարգավիճակը awk-ի:

Զանգահարել արտաքին ծրագիր

Արտաքին ծրագիր awk-ի միջոցով կանչելու համար մենք պետք է նշենք հրամանը, որը ցանկանում ենք կատարել որպես արգումենտ system() ֆունկցիայի համար: Օրինակ, ենթադրենք, որ ցանկանում ենք կատարել date հրամանը awk script-ից: Մենք կարող ենք դա անել հետևյալ կերպ −

{ 
   system("date") 
}

Այս օրինակում մենք կանչում ենք date հրամանը՝ օգտագործելով system() ֆունկցիան: Երբ սկրիպտը կատարվում է, ամսաթիվ հրամանը կատարվում է, և ընթացիկ ամսաթիվը և ժամը ցուցադրվում են էկրանին:

Մուտքագրման փոխանցում արտաքին ծրագրին

Մենք կարող ենք մուտքագրել արտաքին ծրագրին՝ օգտագործելով system() ֆունկցիան: Օրինակ, ենթադրենք, որ ուզում ենք տեսակավորել թվերի ցանկը՝ օգտագործելով sort հրամանը: Մենք կարող ենք դա անել հետևյալ կերպ −

{ 
   print "3
1
2" | "sort" 
}

Այս օրինակում մենք օգտագործում ենք տպագիր հայտարարություն՝ թվերի ցուցակ ստեղծելու համար (3, 1, 2): Այնուհետև մենք օգտագործում ենք խողովակի նշանը (|)՝ թվերի այս ցանկը փոխանցելու համար որպես մուտքագրում՝ տեսակավորման հրամանը: sort հրամանը, այնուհետև տեսակավորում է թվերը և արդյունքը վերադարձնում է awk:

Արտաքին ծրագրի արդյունքի պահպանում

Մենք կարող ենք արտաքին ծրագրի արդյունքը պահել փոփոխականում՝ օգտագործելով getline() ֆունկցիան։ getline() ֆունկցիան օգտագործվում է ֆայլից կամ հրամանից մուտքային տող կարդալու համար: Մենք կարող ենք օգտագործել getline() ֆունկցիան արտաքին ծրագրի արդյունքը գրավելու համար: Օրինակ, ենթադրենք, որ ուզում ենք ls հրամանի ելքը ներառել փոփոխականում: Մենք կարող ենք դա անել հետևյալ կերպ −

{ 
   "ls" | getline output 
   print output 
}

Այս օրինակում մենք օգտագործում ենք system() ֆունկցիան՝ ls հրամանը կատարելու համար: Այնուհետև մենք օգտագործում ենք getline() ֆունկցիան՝ ls հրամանի արդյունքը ելքային փոփոխականում գրավելու համար: Ի վերջո, մենք օգտագործում ենք տպագիր հայտարարությունը ls հրամանի արդյունքը ցուցադրելու համար:

Փաստարկների փոխանցում արտաքին ծրագրին

Մենք կարող ենք արգումենտներ փոխանցել արտաքին ծրագրին՝ օգտագործելով system() ֆունկցիան։ Օրինակ, ենթադրենք, որ ուզում ենք տողը վերածել մեծատառի՝ օգտագործելով tr հրամանը: Մենք կարող ենք դա անել հետևյալ կերպ −

{ 
   str = "hello world" 
   cmd = "echo " str " | tr '[:lower:]' '[:upper:]'" 
   cmd | getline output 
   print output 
}

Այս օրինակում մենք օգտագործում ենք echo հրամանը՝ «բարև աշխարհ» տողը որպես մուտքագրում tr հրամանին փոխանցելու համար: Այնուհետև մենք օգտագործում ենք tr հրամանը՝ տողը մեծատառի վերածելու համար: Վերջապես, մենք օգտագործում ենք getline() ֆունկցիան՝ tr հրամանի ելքը ելքային փոփոխականում գրավելու համար:

Սխալների հետ աշխատելը

Երբ զանգահարում եք արտաքին ծրագիր awk-ի միջոցով, կարևոր է կարգավորել սխալները, որոնք կարող են առաջանալ կատարման ընթացքում: Մենք կարող ենք ստուգել արտաքին ծրագրի ելքի կարգավիճակը՝ օգտագործելով system() ֆունկցիան: Ելքի կարգավիճակը մի թիվ է, որը ցույց է տալիս հրամանի հաջողությունը կամ ձախողումը: Զրո արժեքը ցույց է տալիս հաջողություն, իսկ ոչ զրոյական արժեքը՝ ձախողում:

Օրինակ, ենթադրենք, որ ուզում ենք ստուգել՝ արդյոք ֆայլը գոյություն ունի՝ օգտագործելով test հրամանը: Մենք կարող ենք դա անել հետևյալ կերպ −

{ 
   file = "myfile.txt" 
   cmd = "test -e " file 
   if (system(cmd) != 0) { 
      print "File does not exist" 
   } else { 
      print "File exists" 
   } 
}

Այս օրինակում մենք օգտագործում ենք test հրամանը՝ ստուգելու, թե արդյոք «myfile.txt» ֆայլը գոյություն ունի: Այնուհետև մենք օգտագործում ենք system() ֆունկցիան՝ փորձարկման հրամանը կատարելու համար: Եթե թեստային հրամանի ելքի կարգավիճակը զրոյական չէ, մենք տպում ենք «Ֆայլը գոյություն չունի»: Հակառակ դեպքում մենք տպում ենք «Ֆայլը գոյություն ունի»:

Ընդլայնված օրինակներ

  • Արտաքին ծրագրի ելքի զտում Մենք կարող ենք զտել արտաքին ծրագրի ելքը՝ օգտագործելով awk: Օրինակ, ենթադրենք, որ ցանկանում ենք ցուցադրել ps հրամանի ելքի միայն առաջին տողը: Մենք կարող ենք դա անել հետևյալ կերպ −

{ 
   cmd = "ps" 
   cmd | getline output 
   close(cmd) 
   split(output, lines, "
") 
   print lines[1] 
}

Այս օրինակում մենք օգտագործում ենք getline() ֆունկցիան՝ ps հրամանի ելքը ելքային փոփոխականում գրավելու համար: Այնուհետև մենք օգտագործում ենք split() ֆունկցիան՝ արդյունքը գծերի զանգվածի բաժանելու համար: Ի վերջո, մենք օգտագործում ենք տպագիր հայտարարությունը, որպեսզի ցուցադրենք արտադրանքի առաջին տողը:

  • Օգտագործելով awk փոփոխականները արտաքին հրամաններում Մենք կարող ենք օգտագործել awk փոփոխականները արտաքին հրամաններում: Օրինակ, ենթադրենք, որ մենք ցանկանում ենք ստեղծել մի ֆայլ անունով փոփոխականի հիման վրա՝ օգտագործելով touch հրամանը: Մենք կարող ենք դա անել հետևյալ կերպ −

{ 
   filename = "myfile.txt" 
   cmd = "touch " filename 
   system(cmd) 
}

Այս օրինակում մենք օգտագործում ենք filename փոփոխականը հպման հրամանում՝ «myfile.txt» անունով ֆայլ ստեղծելու համար:

  • Օգտագործելով awk՝ արտաքին ծրագրի ելքը ֆորմատավորելու համար Մենք կարող ենք օգտագործել awk՝ արտաքին ծրագրի ելքը ֆորմատավորելու համար: Օրինակ, ենթադրենք, որ ցանկանում ենք ցուցադրել df հրամանի ելքը ավելի ընթեռնելի ձևաչափով: Մենք կարող ենք դա անել հետևյալ կերպ −

{ 
   cmd = "df -h" 
   cmd | getline output 
   close(cmd) 
   printf "%-20s%-10s%-10s%-10s%-10s%s
", "Filesystem", "Size", "Used", "Avail", "Use%", 
   "Mounted on" 
   split(output, lines, "
") 
   for (i=2; i<=length(lines); i++) { 
      printf "%-20s%-10s%-10s%-10s%-10s%s
", $1, $2, $3, $4, $5, $6 
   } 
}

Այս օրինակում մենք օգտագործում ենք printf հայտարարությունը df հրամանի ելքը ձևաչափելու համար: Մենք տպում ենք վերնագրի տող սյունակների վերնագրերով, որին հաջորդում է df հրամանի ելքը՝ յուրաքանչյուր սյունակով հավասարեցված ֆիքսված լայնությամբ:

Եզրակացություն

Այս հոդվածում մենք ուսումնասիրել ենք, թե ինչպես կարելի է զանգահարել արտաքին ծրագիր՝ օգտագործելով awk: Մենք տեսանք, թե ինչպես մուտքագրել արտաքին ծրագրին, գրավել արտաքին ծրագրի արդյունքը և կարգավորել սխալները, որոնք կարող են առաջանալ կատարման ընթացքում: Օգտագործելով արտաքին ծրագրեր կանչելու awk-ի կարողությունը՝ մենք կարող ենք ավտոմատացնել տարբեր առաջադրանքներ և մեր սցենարներն ավելի հզոր և ճկուն դարձնել: