bash脚本 – sed返回ip地址

我正在开发一个bash脚本,我试图从一个networking接口打开一个IPv4地址,在这个操作我使用IP地址sed ,但有些是错误的,因为我无法从sed获取IP 。

所以,脚本有一点这样:

ip addr show dev eth0 | grep "inet " 

这应该回报:

 inet 192.168.1.3/24 brd 192.168.1.255 scope global eth0 

sed ,我想这个:

 192.168.1.3/24 

我已经尝试了一些正则expression式,但它只给出错误或空行! 我怎样才能做到这一点?

尝试这个

 ip addr show dev eth0 | sed -nr 's/.*inet ([^ ]+).*/\1/p' 

编辑:解释性的话要求。

 -n in sed suppressed automatic printing of input line -r turns on extended regular expressions s/.*inet ([^ ]+).*/\1/p 

搜索任何后跟inet和空格的东西,记住在该空格后面不是空格的所有内容(括号),随后是任何东西,并用记忆的东西[\ 1](IP地址)替换所有内容,然后打印那条线(p)。

我知道你问sed,所以这里是一个使用GNU sed版本4.2.1的答案。 这是非常具体的,并为你所需要的非常烘烤。 根据你的ip addr show命令,我认为这是一个Linux。

 ip addr show dev eth0 \ | sed -n '/^\s\+inet\s\+/s/^\s\+inet\s\+\(.*\)\s\+brd\s.*$/\1/p'` 

使用awk更简单的方法:

ip addr show dev eth0 | awk '$1=="inet" {print $2}'

你可以使用这样的东西:

 sed -e 's/^[^ ]* //' -e 's/ .*//' 

使用grep直接找出你的答案。

 ip addr show dev eth0 | grep -P '\d+\.\d+\.\d+.\d+\/\d+' -o 

那么,sed和awk的答案都是相当不错的。 为了仅获得没有子网掩码的IP,可以继续进行如下操作:

 ip addr show dev eth0 | sed -nr 's/.*inet ([^ ]+).*/\1/p' **| cut -f1 -d'/'** 

要么

 ip addr show dev eth0 | awk '$1=="inet" {print $2}' **| cut -f1 -d'/'** 

要么

更好:

 ip route get 255.255.255.255 | grep -Po '(?<=src )(\d{1,3}.){4}' 

这应该只输出IP地址。