Using AWK Command

April 20 2016

Text File ထဲက Content တွေကိုရှာဖွေတဲ့နေရာမှာ grep အပြင် နောက်ထပ်သုံးလေ့သုံးထရှိတာကတော့ awk ဖြစ်ပါတယ်။ Content ရှာတာခြင်တူပေမဲ့ Output ကို Delimiter (သတ်မှတ်ပိုင်းခြားသင်္ကေတ) သုံးပြီးလိုအပ်တဲ့အပိုင်းလောက်ပဲ ခွဲထုတ်ပြသပေးနိုင်တာ သူ့ရဲ့အားသာချက်တစ်ခုပါ။ Default Delimiter ကတော့ Space ဖြစ်ပါတယ်။ Space ခြားထားတဲ့နေရာတွေကနေပိုင်းခြားပြသပေးမှာဖြစ်ပါတယ်။ လက်တွေ့လေ့လာစမ်းသပ်နိုင်ဖို့ လိုအပ်တဲ့ နမူနာ ဖိုင်လေးတစ်ခုအလျှင်ဦးဆုံး ဖန်တီးပါမယ်။

အောက်မှာပေးထားတဲ့စာသားတွေကို နှစ်သက်ရာ Text Editor တစ်ခုခုထဲကူထည့်ပြီး awktest.txt ဆိုတဲ့နာမည်နဲ့ Desktop ပေါ်မှာ Save လုပ်လိုက်ပါ။

1 MaungMaung Yangon 2000Ks
2 KyawKyaw Bago 2500Ks
3 AyeAye Bago 2500Ks
4 AungAung Pyay 2000Ks
5 MaungHla Yangon 3000Ks
6 KoKo Yangon 3000Ks

7 AyeMaung Bagan 3500Ks

awk command မှာတော့ အပိုင်းသုံးပိုင်းရှိပါတယ်။ Pattern, Procedure နှင့် File တို့ပဲဖြစ်ပါတယ်။

awk '/pattern/ {procedure}' file

Pattern နေရာကတော့ ရှာဖွေမယ့်ဖိုင်ထဲမှာပါဝင်တဲ့ ရှာဖွေလိုတဲ့ စကားလုံး၊ စာသား၊ နံပါတ်၊ သင်္ကေတ စတာတွေကိုသတ်မှတ်ပေးရတာပါ။

Procedure ကတော့ Delimiter ရဲ့ ပိုင်းခြားမှုပေါ်မူတည်ပြီး ဘယ်အပိုင်းကို အလျှင်ပြမယ်၊ ဘယ်အပိုင်းကိုတော့ နောက်မှပြမယ် စတာတွေကိုသတ်မှတ်ပေးတာဖြစ်ပါတယ်။

နောက်ဆုံးပိတ် file ကတော့ ရှာဖွေလိုတဲ့ ဖိုင်နာမည်ပဲဖြစ်ပါတယ်။

ပထမဦးဆုံးအနေနဲ့ awktest.txt ဖိုင်ထဲရှိသမျှစာသားတွေကို awk သုံးပြီးထုတ်ယူကြည့်ပါမယ်။

Command

$ awk '{print;}' ~/Desktop/awktest.txt

Output

1 MaungMaung Yangon 2000Ks
2 KyawKyaw Bago 2500Ks
3 AyeAye Bago 2500Ks
4 AungAung Pyay 2000Ks
5 MaungHla Yangon 3000Ks
6 KoKo Minbu 3000Ks

7 AyeMaung Bagan 3500Ks

နောက်ထပ်တစ်နည်းအနေနဲ့ print $0 ကိုလည်းသုံးနိုင်ပါတယ်။

Command

$ awk '{print $0}' ~/Desktop/awktest.txt

Output

1 MaungMaung Yangon 2000Ks
2 KyawKyaw Bago 2500Ks
3 AyeAye Bago 2500Ks
4 AungAung Pyay 2000Ks
5 MaungHla Yangon 3000Ks
6 KoKo Minbu 3000Ks

7 AyeMaung Bagan 3500Ks

သတ်မှတ် Colum တစ်ခုတည်းမှာရှိတဲ့ စာကြောင်းအားလုံးရဲ့ တစ်စိပ်တစ်ဒေသကိုသာပြသလိုတယ်ဆိုလျှင်တော့ $ ကိုသုံးပြီး Colum နံပါတ်ကိုသတ်မှတ်ပေးရပါတယ်။ ဒီနေရာမှာ ပိုပြီး နားလည်ရလွယ်ကူစေဖို့ နမူနာဖိုင်ကို awk က ဘယ်လို ဖတ်ယူသလဲဆိုတာကို အလျှင်ရှင်းပြပါ့မယ်။ Default Delimiter က Space ဖြစ်တဲ့အတွက် Space ခြားထားတဲ့နေရာတွေကနေ Colum တွေခွဲသွားမှာဖြစ်ပါတယ်။ Colum ကိုတော့ $1 ကနေစပြီး သတ်မှတ်ပါတယ်။

Awk1

ဒါကြောင့် ဒုတိယ Colum မှာရှိတဲ့ လူနာမည်တွေကိုပဲခွဲထုတ်ယူချင်တယ်ဆိုလျှင်တော့ -

Command

$ awk '{print $2}' ~/Desktop/awktest.txt

Output

MaungMaung
KyawKyaw
AyeAye
AungAung
MaungHla
KoKo

AyeMaung

Colum 2 နဲ့ 4 ကိုပဲ ထုတ်ယူမယ်ဆိုလျှင်တော့ -

Command

$ awk '{print $2,$4}' ~/Desktop/awktest.txt

Output

MaungMaung 2000Ks
KyawKyaw 2500Ks
AyeAye 2500Ks
AungAung 2000Ks
MaungHla 3000Ks
KoKo 3000Ks

AyeMaung 3500Ks

အထက်မှာပြခဲ့တဲ့ နမူနာတွေကတော့ Procedure သုံးပြီး ထုတ်ယူတဲ့နည်းတွေပါ။ အခု Pattern ပါသုံးပြီး ထုတ်ကြည့်ပါမယ်။ awktest.txt ထဲက Maung ဆိုတဲ့စာသားပါတဲ့ စာကြောင်းတွေကိုပဲရွေးထုတ်ပါမယ်။

Command

$ awk '/Maung/ {print $0}' ~/Desktop/awktest.txt

Output

1 MaungMaung Yangon 2000Ks
5 MaungHla Yangon 3000Ks
7 AyeMaung Bagan 3500Ks

Pattern အနေနဲ့ Maung ဆိုတဲ့စာသားကိုရှာပြီး Procedure အနေနဲ့ $0 ကို သုံးလိုက်တဲ့အတွက် awktest.txt ထဲရှိသမျှ Maung ပါတဲ့စာကြောင်းတွေကိုထုတ်ပြသွားတာဖြစ်ပါတယ်။ အကယ်၍များ $2,$4 နှစ်ခုတည်းကိုသာလိုချင်တယ်ဆိုလျှင်တော့ -

Command

$ awk '/Maung/ {print $2,$4}' ~/Desktop/awktest.txt

Output

MaungMaung 2000Ks
MaungHla 3000Ks
AyeMaung 3500Ks

Procedure အနေနဲ့ $2,$4 ဆိုပြီး ထုတ်ယူတဲ့အတွက် နာမည်ပြီးမှ ငွေပမာဏကို ပြပေးတာပါ။ $4,$2 လို့သာသတ်မှတ်မယ်ဆိုလျှင်တော့ ငွေပမာဏကိုအလျှင်ပြပေးပါလိမ့်မယ်။

Command

$ awk '/Maung/ {print $4,$2}' ~/Desktop/awktest.txt

Output

2000Ks MaungMaung
3000Ks MaungHla
3500Ks AyeMaung

Awk ရဲ့ နောက်ထပ်ထူးခြားတဲ့အချက်တစ်ခုကတော့ Number တွေကို နှိုင်းယှဉ်ကြည့်နိုင်တာပါပဲ။ $4 မှာရှိတဲ့ ငွေပမာဏတွေထဲကမှ 2500Ks ထက်ပိုတဲ့သူတွေရဲ့ စာရင်းကိုကြည့်ကြည့်ပါမယ်။

Command

$ awk '$4 > "2500Ks"' ~/Desktop/awktest.txt

Output

5 MaungHla Yangon 3000Ks
6 KoKo Yangon 3000Ks
7 AyeMaung Bagan 3500Ks

ဒီနေရာမှာတော့ သတိထားရမှာက Greater Than - (>) နဲ့ Double Quote - (" ") ပါပဲ။ 2500Ks ထက်များတဲ့ပမာဏကို လိုချင်တာဖြစ်တဲ့အတွက် > sign ကိုသုံးတာဖြစ်ပြီး " " ကတော့ 2500Ks တွေမပါအောင်ထည့်ပေးရတာပါ။ " " မထည့်ဘူးဆိုလျှင်တော့ 2500Ks တွေပါ ပါပါလိမ့်မယ်။

Command

$ awk '$4 > 2500Ks' ~/Desktop/awktest.txt

Output

2 KyawKyaw Bago 2500Ks
3 AyeAye Bago 2500Ks
5 MaungHla Yangon 3000Ks
6 KoKo Yangon 3000Ks
7 AyeMaung Bagan 3500Ks

သတ်မှတ်ပမာဏနဲ့ တူညီတဲ့ စာရင်းကိုသာရွေးထုတ်မယ်ဆိုလျှင်တော့ ~ ကိုသုံးရပါတယ်။

Command

$ awk '$4 ~ 2500Ks' ~/Desktop/awktest.txt

Output

2 KyawKyaw Bago 2500Ks
3 AyeAye Bago 2500Ks

Procedure နဲ့တွဲဖက်ပြီးလည်း အသုံးပြုနိုင်ပါသေးတယ်။

Command

$ awk '$4 < "3000Ks" {print $2,$4}' ~/Desktop/awktest.txt

Output

MaungMaung 2000Ks
KyawKyaw 2500Ks
AyeAye 2500Ks
AungAung 2000Ks
 

စာကြောင်းတစ်ကြောင်းစီရဲ့ အက္ခရာအရေအတွက်ပေါ်မူတည်ပြီး ပိုင်းခြားထုတ်ယူမယ်ဆိုလျှင်တော့ length ကိုသုံးနိုင်ပါတယ်။

Command

$ awk 'length>22' ~/Desktop/awktest.txt

Output

1 MaungMaung Yangon 2000Ks
5 MaungHla Yangon 3000Ks
7 AyeMaung Bagan 3500Ks

အက္ခရာအရေအတွက် ၂၂ထက်ပိုတဲ့စာကြောင်းတွေကိုထုတ်ပြပေးသွားတာပဲဖြစ်ပါတယ်။

Pattern နဲ့ ထုတ်ယူတဲ့နေရာမှာ Regular Expression (RegEx) တွေသုံးနိုင်ပါသေးတယ်။ ဒီနေရာမှာတော့ အသုံးများတဲ့ ^ နဲ့ $ တို့ကိုပဲအဓိကထားပြောပြပေးပါမယ်။ ^ က စာကြောင်းရဲ့အစကိုဆိုလိုတာဖြစ်ပြီး $ ကတော့ စာကြောင်းအဆုံးကိုဆိုလိုတာဖြစ်ပါတယ်။

Command

$ awk '/^2/' ~/Desktop/awktest.txt

Output

2 KyawKyaw Bago 2500Ks

/^2/ ဆိုတဲ့အတိုင်း 2 နဲ့စတဲ့ စာကြောင်းကိုရွေးထုတ်ပြသပေးသွားတာဖြစ်ပါတယ်။

Command

$ awk '/500Ks$/' ~/Desktop/awktest.txt

Output

2 KyawKyaw Bago 2500Ks
3 AyeAye Bago 2500Ks
7 AyeMaung Bagan 3500Ks

/500Ks$/ ကတော့ 500Ks နဲ့ဆုံးတဲ့စာကြောင်းတွေကို မြင်တွေ့ရမှာပါ။ ^ က စာကြောင်းရဲ့အစကိုသတ်မှတ်တာဖြစ်တဲ့အတွက် ရှာဖွေလိုတဲ့စာသားရဲ့ အရှေ့မှာရေးရပြီး $ ကတော့ အဆုံးဖြစ်တဲ့အတွက် နောက်မှာထားပြီးရေးရပါတယ်။ ဘာစာသားမှမထည့်ပဲ /^$/ လို့တွဲရေးလိုက်မယ်ဆိုလျှင်တော့ Blank Line တွေကိုပဲထုတ်ပြပါလိမ့်မယ်။

Command

$ awk '/^$/' ~/Desktop/awktest.txt

Output အနေနဲ့ကတော့ awktest.txt ရဲ့ 6 နဲ့ 7 ကြားမှာပါနေတဲ့ Blank Line တစ်ခုစာကိုပဲပြပေးမှာဖြစ်ပါတယ်။

နောက်ထပ်အသုံးဝင်တဲ့ RegEx Pattern တစ်ခုကတော့ ထပ်နေတဲ့စာလုံးတွေကိုဖယ်ပြီးပြပေးတာပါ။

Command

$ awk '!x[$3]++ {print $3}' ~/Desktop/awktest.txt

Output

Yangon
Bago
Pyay

Bagan

$3 နေရာမှာရှိတဲ့ မြို့နာမည်တွေကို တူရာစုပြီး တစ်ခုစီထုတ်ပြပေးလိုက်တာပဲဖြစ်ပါတယ်။

အထက်မှာပြသခဲ့တဲ့ နမူနာတွေအကုန်လုံးမှာသုံးခဲ့တဲ့ awktest.txt ဖိုင်က Default Delimiter ဖြစ်တဲ့ Space ကိုပဲသုံးထားတာကြောင့် Delimiter ကို သီးသန့်သတ်မှတ်ပေးစရာမလိုတာပါ။ အကယ်၍ /etc/passwd ဖိုင်လို : နဲ့ပိုင်းခြားထားတဲ့ဖိုင်မျိုးဆိုလျှင်တော့ Delimiter သတ်မှတ်ပေးရပါတယ်။

Command

$ awk -F: '{print $1,$6}' /etc/passwd

Output

root /root
bin /bin
daemon /sbin
adm /var/adm
lp /var/spool/lpd
sync /sbin
shutdown /sbin
halt /sbin
mail /var/spool/mail
...

အခုရှင်ပြထားသလောက်က Awk ရဲ့ အသုံးများ တဲ့နည်းလမ်းလေးတွေပဲဖြစ်ပါတယ်။ တကယ်တမ်း Awk ကိုလေ့လာမယ်ဆိုလျှင် Programming Language တစ်ခုလေ့လာရသလောက်ကို အချိန်ပေးပြီးလေ့လာရပါလိမ့်မယ်။ သို့ပေမယ့် SysAdmin တစ်ယောက်အနေနဲ့ သာမာန် Log Analysis လုပ်ဖို့အတွက်လောက်ဆိုလျှင်တော့ အခုလေ့လာရသလောက်ကိုပဲ အနည်းငယ်ကွန့်မြူးလိုက်ရုံနဲ့ အလုပ်ဖြစ်နိုင်ပါတယ်။ ဒါကြောင့် ဒီလောက်နဲ့ပဲရပ်ထားလိုက်ပါမယ်။ လိုအပ်ချက်များ၊ ထပ်မံဖြည့်စွက်စေလိုသည့်အချက်များရှိခဲ့လျှင်လည်း အကြံပြုပေးစေချင်ပါတယ်။


comments powered by Disqus