我正在尝试提取 Linux 上网络接口的 IPv4 地址。我有一个可行的解决方案:
IFACE=eth0
ip a show dev $IFACE | sed -n 's/.*inet \(.*\)\/.*/\1/p'
为了记录,以下是该ip a show
命令的示例输出:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:51:51:b4:a9:08 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.20/24 brd 10.0.2.255 scope global ens192
valid_lft forever preferred_lft forever
inet6 fe80::251:56ff:fec1:4915/64 scope link
valid_lft forever preferred_lft forever
虽然我的解决方案有效,但我想知道是否有sed 方式抓取正则表达式模式匹配组的内容并替换当前行(在 sed 术语中,模式空间) 或以某种方式打印它?我认为必须使用s///p
并将模式扩展到整行(.*
在开头和结尾)是一个临时解决方案。
答案1
解析ip
面向人的输出是一个难题。使用 JSON 输出:
ip -4 -json a show dev $IFACE scope global | jq -r ".[].addr_info[].local"
答案2
您可以删除所有不想要的内容,例如:sed -n 's:.*inet ::; T; s:/.*::p'
。
但是,另一种方法是使用ip -o -f inet
和标准工具,例如tr
和cut
:
ip -o -f inet addr show dev eth0 | tr -s ' ' '/' | cut -d/ -f4