Linux 獲得純ip信息 grep/sed/awk/正則表達式

先用grep得到ip所在行:

ip a | grep inet | grep -v inet6

在這裏插入圖片描述

1.用awk命令獲得ip

awk命令類似cut命令,但是awk的分割符可以是多個字符,cut只能以單個字符作爲分割符。
'inet '爲分割符,打印得到其後的內容,再用'/'做分割符,打印得到其前的內容。

ip a | grep inet | grep -v inet6 | awk -F 'inet ' '{print $2}' | awk -F '/' '{print $1}'

在這裏插入圖片描述

2.用sed命令獲得ip

先將'inet '替換成空(兩個單引號),再把'/'後面替換成空。
在單引號裏面的/要用\轉義,.*表示任意長字符串,$表示行尾。

ip a | grep inet | grep -v inet6 | sed s/'inet '/''/g | sed s/'\/.*$'/''/g

在這裏插入圖片描述

得到ip所在行,還有一種花裏胡哨的寫法

得到ip所在行,還有一種正則表達式的寫法,效果同ip a | grep inet | grep -v inet6

ip a | egrep "((1[0-9]|2[0-5])|[1-9])?[0-9]{1}\.((1[0-9]|2[0-5])|[1-9])?[0-9]{1}\.((1[0-9]|2[0-5])|[1-9])?[0-9]{1}\.((1[0-9]|2[0-5])|[1-9])?[0-9]{1}"

在這裏插入圖片描述

ip地址以.分割,有4段,只要看一段,先看 ( (1[0-9]|2[0-5]) | [1-9] )?[0-9]{1}\.

{1}表示前面的[0-9]一定有一個,也就是個位數爲0-9
?表示前面的((1[0-9]|2[0-5])|[1-9])要麼有,要麼沒有。有的話就是10~25或者1~9,配合上個位數,最終就是100~259或者10~99;沒有的話最終就只有個位數0~9。

綜上所述,單個字段匹配範圍是0-259,這麼寫顯然是有漏洞的,單個會匹配上256,四個寫上就會匹配256.256.256.256,而ip每個字段都不可能超過255
echo 256.256.256.256 | egrep "((1[0-9]|2[0-5])|[1-9])?[0-9]{1}\.((1[0-9]|2[0-5])|[1-9])?[0-9]{1}\.((1[0-9]|2[0-5])|[1-9])?[0-9]{1}\.((1[0-9]|2[0-5])|[1-9])?[0-9]{1}" 會發現能完全匹配上256.256.256.256
在這裏插入圖片描述

附:正則表達式

^ : ^word,待搜索的字符串在⾏⾸; 
$ : word$,待搜索的字符串的⾏尾; 
. : ⼀定有⼀個任意字符; 
\ : 將特殊符號轉義爲⼀般字符; 
* : 重複前⼀個字符,零到⽆窮多個。比如o*
.*爲任意字符串; 
[ ] : 字符集合,從中選⼀個;
[^ ] : 字符集合,不要的字符或範圍; 
[n1-n2] : 字符範圍,[0-9][a-z]; 
{n, m} : 連續n個到m個的前⼀個字符;比如o{3,5}
+ : ⼀個或⼀個以上;比如o+
? : 零個或⼀個;比如o?
| :; 
( ) : 組羣.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章