Bash脚本 - 使用sed返回IP地址

4

我正在开发一份bash脚本,尝试从一个处于ON状态的网络接口获取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

我尝试了一些正则表达式,但只得到错误或空行!我该怎么做才能实现这个目标?


6
提取"awk"命令输出结果中第二个字段的内容。 - Anya Shenanigans
我会将其导入另一个 grep -o [0-9.]\+/[0-9]\+ 中(抱歉,我无法测试,因为我现在正在使用 Windows)。 - FrankieTheKneeMan
@Petesh,这很好用!但它不是使用 sed - Paulo Oliveira
@PauloOliveira 要求使用 sed 有点奇怪,从我的角度来看...几乎像是一项家庭作业练习。 - Anya Shenanigans
@Petesh,你是第一个回答的人,但是你并没有给出答案,而是留了一条评论,所以我无法“接受”你的建议:( - Paulo Oliveira
ip addr show dev eth0 | awk '$1 == "inet" { print $2 }' - johnsyweb
5个回答

5

试试这个

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

一次性删除掩码:ip -4 addr show eno1 | sed -nr 's|.*inet ([^ ]+)/.*|\1|p' - Tony

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}'


这个跟 awk 的解决方案类似。在我的 OS X 上可以工作: ifconfig vnic0 | grep inet | awk '$1=="inet" {print $2}' - Cameron Taggart

0
你可以使用类似这样的代码:
sed -e 's/^[^ ]* //' -e 's/ .*//'

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


0
使用 grep 直接找到你的答案。
ip addr show dev eth0 | grep -P '\d+\.\d+\.\d+.\d+\/\d+' -o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接