4

我正在开发一个 bash 脚本,我正在尝试从打开的网络接口获取 IPv4 地址,在此操作中我使用ip addrsed,但出现问题,因为我无法从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

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

4

5 回答 5

4

尝试这个

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

于 2013-04-12T21:50:22.617 回答
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}'

于 2013-04-12T21:56:03.637 回答
0

你可以使用这样的东西:

sed -e 's/^[^ ]* //' -e 's/ .*//'
于 2013-04-12T21:51:54.087 回答
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 地址。

于 2013-10-18T10:09:31.853 回答
0

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

ip addr show dev eth0 | grep -P '\d+\.\d+\.\d+.\d+\/\d+' -o
于 2013-04-13T04:27:04.693 回答