bash脚本 - sed返回ip地址

时间:2013-04-12 21:46:01

标签: regex linux bash sed

我正在开发一个bash脚本,我正试图从一个打开的网络接口获取一个IPv4地址,在这个操作中我正在使用 ip addr sed < / strong>,但出了点问题,因为我无法从 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

我尝试过一些正则表达式,但它只会出错或空行!我怎样才能做到这一点?

5 个答案:

答案 0 :(得分:2)

试试这个

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)。

答案 1 :(得分:1)

我知道你要求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}'

答案 2 :(得分:0)

您可以使用以下内容:

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

答案 3 :(得分:0)

使用grep直接找到答案。

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

答案 4 :(得分:0)

嗯,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地址。