၂ · စက်ပစ္စည်း Output များကို Parse လုပ်ခြင်း (Parsing Device Output)¶
ကွန်ရက်စက်ပစ္စည်းများသည် လူသားများဖတ်ရှုရန် ရည်ရွယ်ထားသော စာသားများကို ထုတ်ပေးလေ့ရှိသည်။ သို့သော် Automation စနစ်များက ဒေတာ (structured data) ကိုသာ လိုအပ်ပါသည်။ ဤစာမျက်နှာသည် အဆိုပါ ကွာဟချက်ကို ပေါင်းကူးပေးမည့် နည်းလမ်းများအကြောင်း ဖြစ်ပါသည်။
grep — သက်ဆိုင်ရာ စာကြောင်းများကို ရှာဖွေခြင်း¶
grep Estab summary.txt # Estab ပါဝင်သော စာကြောင်းများကို ရှာသည်
grep -v Estab summary.txt # Estab မပါဝင်သော စာကြောင်းများကို ရှာသည်
grep -i estab summary.txt # စာလုံးအကြီးအသေး မခွဲခြားဘဲ ရှာသည်
grep -c Estab summary.txt # ကိုက်ညီသော စာကြောင်းအရေအတွက်ကို ရေတွက်သည်
grep -q Estab summary.txt # တိတ်ဆိတ်စွာ စစ်သည်; Exit code သာ ထွက်သည်
grep -E "Idle|Active" summary.txt # Regex alternation (သို့မဟုတ်) ဖြင့် ရှာသည်
grep -A2 -B1 "Ethernet1" cfg.txt # တွေ့သောလိုင်း၏ နောက် ၂ ကြောင်း၊ ရှေ့ ၁ ကြောင်းပါ ပြသည်
Scripts များတွင် အရေးအပါဆုံး flag ၂ ခု:
-q— စာသားမထုတ်ဘဲ exit code သာ ပေးသည် — "ဤစာသား ပါမပါ စစ်ဆေးရန်" အတွက် သုံးသည်။-E— Extended regex ဖြစ်သည် —Idle|Activeဟု ရေးသားနိုင်ပြီး failure states အားလုံးကို တစ်ပြိုင်နက် ဖမ်းယူနိုင်သည်။
# Config ဖိုင်အတွင်းရှိ interface block တိုင်းကို ရှာဖွေခြင်း
grep -A5 "^interface" running-config.txt
awk — ကော်လံနှင့် ကွက်လပ် (Fields) များကို ထုတ်ယူခြင်း¶
awk သည် စာကြောင်းတစ်ကြောင်းစီကို whitespace နေရာများတွင် fields များအဖြစ် ခွဲခြားပေးပြီး ၎င်းတို့ကို print ထုတ်ခြင်း သို့မဟုတ် စစ်ဆေးခြင်းများ ပြုလုပ်နိုင်စေပါသည်။
$1 သည် ပထမကော်လံ၊ $2 သည် ဒုတိယကော်လံ၊ $0 သည် စာကြောင်းတစ်ခုလုံး ဖြစ်သည်။
Phase 1 fabric ပေါ်တွင် စမ်းသပ်ထားခြင်း:
docker exec clab-bgp-lab-r1 Cli -p 15 -c "show ip bgp summary" \
| awk '/Estab/ {print $1, $3, $9}'
2.2.2.2 65001 Estab
10.0.13.3 65002 Estab
အဓိက ပုံစံမှာ: /match/ { action } ဖြစ်သည်။ အဆိုပါ pattern နှင့် ကိုက်ညီသော စာကြောင်းများကိုသာ action ပြုလုပ်ပေးပါသည်။
အသုံးဝင်သော နမူနာများ:
awk '{print $1}' # ပထမ ကော်လံကို ထုတ်ယူသည်
awk -F: '{print $1}' # ':' နေရာတွင် ခွဲထုတ်သည်
awk '$3 > 100 {print $1}' # ကိန်းဂဏန်း နှိုင်းယှဉ်စစ်ဆေးသည်
awk '/Estab/ {n++} END {print n+0}' # ကိုက်ညီသော အရေအတွက်ကို ရေတွက်သည်
awk 'NF' # လိုင်းလွတ်များကို ဖယ်ရှားသည်
awk '{print NR": "$0}' # လိုင်းနံပါတ်များ တပ်ပေးသည်
လက်တွေ့ကျသော ဥပမာ — Established မဖြစ်သော peers များကို အချက်ပြဖော်ထုတ်ခြင်း:
docker exec clab-bgp-lab-r1 Cli -p 15 -c "show ip bgp summary" \
| awk '$1 ~ /^[0-9]+\./ && $9 != "Estab" {print "DOWN: " $1}'
$1 ~ /^[0-9]+\./ သည် IP address ဖြင့် စတင်သော စာကြောင်းများကိုသာ စစ်ထုတ်ပေးပြီး header စာသားများကို ကျော်သွားစေပါသည်။
awk သည် အဘယ်ကြောင့် cut ထက် ပိုမိုကောင်းမွန်သနည်း
cut -d' ' -f3 သည် space တစ်ခုချင်းစီကို separator အဖြစ် သတ်မှတ်သောကြောင့် space အများအပြားပါပါက ဗလာ fields များ ထွက်ပေါ်လာတတ်သည် — စက်ပစ္စည်း output များသည် ကော်လံတန်းညှိထားသော space များစွာ ပါလေ့ရှိသည်။ awk သည် whitespace များကို အလိုအလျောက် ပေါင်းစည်းပေးသောကြောင့် ပိုမိုတိကျစွာ ထုတ်ယူနိုင်ပါသည်။
sed — စာသားများကို အစားထိုး ပြုပြင်ခြင်း¶
အဓိကအားဖြင့် စာသားအစားထိုးခြင်း (substitution) အတွက် သုံးပါသည်:
sed 's/old/new/' # လိုင်းတစ်ခုစီ၏ ပထမဆုံးတွေ့သော စာသားကို အစားထိုးသည်
sed 's/old/new/g' # တွေ့သမျှ အားလုံးကို အစားထိုးသည်
sed 's|10.0.12|10.0.99|g' # အခြား delimiter သုံးထား၍ slashes များကို escape လုပ်စရာမလိုပါ
sed -n '5,10p' # လိုင်းနံပါတ် ၅ မှ ၁၀ အထိသာ ပြသသည်
sed '/^!/d' # '!' ဖြင့်စသော comment လိုင်းများကို ဖျက်ပစ်သည်
sed -i.bak 's/a/b/g' f # ဖိုင်ထဲ တိုက်ရိုက်ပြင်ပြီး မူရင်းကို f.bak အဖြစ် သိမ်းသည်
Config များကို diff မစစ်မီ သန့်ရှင်းရေးလုပ်ခြင်း — comments၊ လိုင်းလွတ်များနှင့် timestamps များကို ဖယ်ရှားခြင်း:
sed -e '/^!/d' -e '/^$/d' -e '/Last configuration change/d' running-config.txt
jq — JSON ဒေတာများအတွက်¶
ခေတ်မီ NOS များသည် text ထက် အဆပေါင်းများစွာ ပိုမိုကောင်းမွန်သော JSON format ဖြင့် အချက်အလက် ထုတ်ပေးနိုင်ပါသည်။ EOS တွင် show commands အများစုနောက်၌ | json ခံရိုက်နိုင်ပြီး REST/gNMI APIs များကလည်း JSON ကို တိုက်ရိုက် ထုတ်ပေးပါသည်။
docker exec clab-bgp-lab-r1 Cli -p 15 -c "show ip bgp summary | json" \
| jq '.vrfs.default.peers | keys'
jq '.' # JSON ကို ဖတ်ရလွယ်အောင် ပုံစံထုတ်ပြသည် (pretty-print)
jq -r '.name' # Double-quotes မပါသော raw output ကို ယူသည်
jq '.items[]' # Array အတွင်းရှိ items များကို ပတ်ပြသည်
jq '.items[] | select(.up)' # စစ်ထုတ်သည်
jq -r '.peers | to_entries[] | "\(.key) \(.value.peerState)"'
-r သည် scripts များတွင် အလွန်အရေးကြီးပါသည် — ၎င်းမပါပါက string များတွင် quotes များ ကပ်ပါလာပြီး နှိုင်းယှဉ်စစ်ဆေးမှုများ fail ဖြစ်တတ်ပါသည်။
စက်က JSON ပေးနိုင်ပါက Text ထက် JSON ကို အမြဲ ဦးစားပေးပါ
Text output သည် လူဖတ်ရန်ဖြစ်ပြီး Software versions အလိုက် ပြောင်းလဲတတ်ပါသည် — ကော်လံအကျယ်များ ရွေ့သွားခြင်း၊ headers များ ပြောင်းလဲသွားခြင်းတို့ကြောင့် သင်၏ awk $9 သည် မှားယွင်းသော field ကို ကောက်ယူမိသွားတတ်သည်။
JSON keys များသည် API ၏ အစိတ်အပိုင်းဖြစ်ပြီး အမြဲတမ်း တည်ငြိမ်ပါသည်။ စက်က | json ထောက်ပံ့ပါက ၎င်းကိုသုံးပြီး jq ဖြင့် parse လုပ်ပါ။ မထောက်ပံ့သော စက်များအတွက်သာ awk ကို သုံးပါ။
sort, uniq, နှင့် အရေအတွက် ရေတွက်ခြင်း¶
sort file # အက္ခရာစဉ်အတိုင်း စီသည်
sort -u file # စီပြီး ထပ်နေသည်များကို ဖယ်ရှားသည် (deduplicated)
sort -n file # ကိန်းဂဏန်းတန်ဖိုးအလိုက် စီသည်
sort -k3 file # တတိယကော်လံအလိုက် စီသည်
uniq -c # ထပ်နေသော အရေအတွက်ကို ရေတွက်သည် — input သည် sort လုပ်ပြီးသား ဖြစ်ရမည်
Log ဖိုင်များထဲတွင် အဖြစ်အများဆုံး ပြဿနာကို ရှာဖွေသော နာမည်ကျော် နည်းလမ်း:
grep ERROR app.log | awk '{print $5}' | sort | uniq -c | sort -rn | head
စက်နှစ်လုံး၏ Config များကို နှိုင်းယှဉ်ခြင်း (Diffing)¶
diff <(ssh r1 "show running-config") <(ssh r2 "show running-config")
<(...) သည် Process Substitution ဖြစ်ပါသည် — Command ၏ output ကို ယာယီဖိုင်တစ်ခုကဲ့သို့ ဟန်ဆောင်ပေးပါသည်။ ယာယီဖိုင်များ ဆောက်စရာမလိုဘဲ ဖိုင်အမည် မျှော်လင့်ထားသော မည်သည့် tool နှင့်မဆို အလုပ်လုပ်ပါသည်။
# Whitespace နှင့် comment စာကြောင်းများကို လျစ်လျူရှု၍ နှိုင်းယှဉ်ခြင်း
diff -w <(sed '/^!/d' r1.cfg) <(sed '/^!/d' r2.cfg)
လက်တွေ့ အသုံးချမှု ဥပမာတစ်ခု တည်ဆောက်ခြင်း¶
Config drift စစ်ဆေးခြင်း — စက်မှ config ကို ယူသည်၊ သန့်ရှင်းရေးလုပ်သည်၊ မူလ baseline ဖိုင်နှင့် နှိုင်းယှဉ်သည်:
#!/usr/bin/env bash
set -euo pipefail
for n in r1 r2 r3; do
docker exec "clab-bgp-lab-$n" Cli -p 15 -c "show running-config" \
| sed -e '/^!/d' -e '/^$/d' \
> "current/$n.cfg"
if ! diff -q "baseline/$n.cfg" "current/$n.cfg" >/dev/null 2>&1; then
echo "=== $n DRIFTED ==="
diff "baseline/$n.cfg" "current/$n.cfg" || true
fi
done
ပြောင်းလဲမှု မရှိပါက တိတ်ဆိတ်နေမည်ဖြစ်သည်။ || true သည် ဖိုင်များ ကွဲပြားနေချိန်တွင် diff က exit 1 ထုတ်ပေးသော်လည်း set -e ကြောင့် script ရပ်မသွားစေရန် ထိန်းပေးခြင်း ဖြစ်သည်။
ဆက်လက်လေ့လာရန်: SSH ကို စနစ်တကျ သုံးစွဲနည်း → — အဆိုပါစနစ်များ အားလုံး ချိတ်ဆက်အလုပ်လုပ်ရသည့် အောက်ခံ transport လမ်းကြောင်း။