先用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?
| : 或;
( ) : 组群.