用 Perl 當然是好做很多,但還是想用 awk 包,之後遇到的問題會比較少 (其中一個原因是因為 FreeBSD 剛裝好的時候系統內沒有 Perl,如果之後要重複使用這個功能,用 awk 寫比較方便)。
ifconfig 輸出的結果像是這樣:
lo0: flags=8049因為 awk 是一行一行讀 (回頭讀的話比較麻煩),而我只打算抓出 IPv4 (包括 IP alias) 的部分,所以想法是用一個暫存變數 INTERFACE 來放最近一次的 interface 名稱。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
其中用到 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
沒有留言:
張貼留言