星期日, 6月 24, 2012

利用 ifconfig 的結果,產生每個 IP address 所屬的 interface

為了把 Heartbeat 設定檔弄進 local ports system 內,需要知道這是哪台機器,寫完之後才發現這個問題可以抓 hostname 解決... 還是把這次用 awk 的一些事情記錄下來吧 :o

Perl 當然是好做很多,但還是想用 awk 包,之後遇到的問題會比較少 (其中一個原因是因為 FreeBSD 剛裝好的時候系統內沒有 Perl,如果之後要重複使用這個功能,用 awk 寫比較方便)。

ifconfig 輸出的結果像是這樣:

lo0: flags=8049 metric 0 mtu 16384
        options=3
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x7
        nd6 options=3
因為 awk 是一行一行讀 (回頭讀的話比較麻煩),而我只打算抓出 IPv4 (包括 IP alias) 的部分,所以想法是用一個暫存變數 INTERFACE 來放最近一次的 interface 名稱。

其中用到 match() 會將抓到的部分放入 RSTART (放 offset) 與 RLENGTH (放長度) 的特性:
ifconfig -a | awk '{
  if (match($0, "^[0-9A-Za-z]+:")) {
    INTERFACE = substr($0, RSTART, RLENGTH - 1);
  } else if (match($0, "inet [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+")) {
    print INTERFACE, substr($0, RSTART + 5, RLENGTH - 5);
  }
}'
可能還有些地方可以再修的有彈性一點,不過上面這段 code 在目前的 FreeBSD 應該都能跑,可以預期的是抓 interface 的部分如果遇到帶底線的名稱就會掛 :P

沒有留言: