Ինչպես զանգահարել արտաքին ծրագիր՝ օգտագործելով 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-ի կարողությունը՝ մենք կարող ենք ավտոմատացնել տարբեր առաջադրանքներ և մեր սցենարներն ավելի հզոր և ճկուն դարձնել: