透過 sed 與 awk 都可以把文件做過濾和轉換成新的輸出內容.不過 sed 適合用於一整行的資料處理,而 awk 則比較適合將一整行做多個 欄位 的資料處理.先來看看 sed 的範例.
只想把 ifconfig 網卡裝置 ens33 過濾剩下 IP Address 的輸出,這時候需要配合 grep ( https://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
沒有解決問題,試試搜尋本站其他內容