為了把
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