4,549 瀏覽數

Bash shell script 輸出 IP Address

透過 sed 與 awk 都可以把文件做過濾和轉換成新的輸出內容.不過 sed 適合用於一整行的資料處理,而 awk 則比較適合將一整行做多個 欄位 的資料處理.先來看看 sed 的範例.

只想把 ifconfig 網卡裝置 ens33 過濾剩下 IP Address 的輸出,這時候需要配合 grep ( http://benjr.tw/93776 ) 以及正規表示法 一起使用.
使用 grep 在文字資料裡搜尋 Keyword 關鍵字在哪一行.因為有 inet 與 inet6 兩種,所以搜尋字串設定 inet 後面多加入一格空白.

root@ubuntu:~# ifconfig ens33 | grep 'inet '
          inet addr:172.16.15.129  Bcast:172.16.15.255  Mask:255.255.255.0

接下來的資料可以使用 sed 或是 awk 來處理.

sed

這時需要刪除前面與後面字串即可,先來處理前面字串.

root@ubuntu:~# ifconfig ens33 | grep 'inet ' | sed 's/^.*inet addr://g'
172.16.15.129  Bcast:172.16.15.255  Mask:255.255.255.0

s/regexp/replacement/
replacement 的字串會取代 regexp 彈因為沒有定義 replacement ,所以變成 刪除 ^.*inet addr , 加入參數 g 當同一行有多個 regexp 只會取代第一個符合的字串.如果要全部取代需要在最後面,非必要).

^.*inet addr: 代表的意思是?

  • ^ 表示匹配的字元串在行首
  • . 表示一個任意字元
  • * 表示 “重複” 零個到無窮多個的前字元
  • .* 表示為任意字元
  • ^.* 從開頭的字串任意字元

接著要處理後面的字串

root@ubuntu:~# ifconfig ens33 | grep 'inet ' | sed 's/^.*inet addr://g' | sed 's/Bcast.*$//'
172.16.15.129

Bcast.*$ 代表,從 Bcast到字尾都刪除.

  • . 表示一個任意字元
  • * 表示 “重複” 零個到無窮多個的前字元
  • .* 表示為任意字元
  • $ 表示匹配的字元在行尾
  • .*$ 到行尾的任意字元

awk

可以看到資料是以 (空白鍵) 或是 : (分號) 來區隔,我們可利用 BEGIN{FS=” “} 及 BEGIN{FS=” “} 來做資料處理.
FS (Fields splits) 預設的欄位區分是以 空白或是 tab 做分隔,要改成其他如 冒號 “:” 來作欄位的分隔時就需要設定 FS 變數.awk 在執行時就會先把第一行的資料讀取進來等待處理,所以 FS 的定義必須透過 BEGIN{} ,所定義的內容只會執行一次.

root@ubuntu:~# ifconfig ens33 | grep 'inet ' | awk 'BEGIN{FS=" "} {print $2} '
addr:172.16.15.130
root@ubuntu:~# ifconfig ens33 | grep 'inet ' | awk 'BEGIN{FS=" "} {print $2} ' | awk 'BEGIN{FS=":"} {print $2}'
172.16.15.130

發表迴響