မာတိကာ သို့ သွားရန်

၂ · စက်ပစ္စည်း 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 လမ်းကြောင်း။