You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash脚本中使用ip命令提取IPv6全局前缀?

提取wlan0接口的IPv6全局前缀方案

方法1:用awk快速提取

直接执行这条命令即可:

ip -6 a show dev wlan0 | awk '/inet6/ && /global/ {split($2, p, "/"); printf "%s/%s\n", substr(p[1], 1, index(p[1], "::")+1), p[2]}'

简单拆解逻辑:

  • ip -6 a show dev wlan0:输出wlan0网卡的所有IPv6地址信息
  • /inet6/ && /global/:只筛选带inet6(IPv6地址行标识)和global(全局地址类型)的行,避开本地链路地址这类无关条目
  • split($2, p, "/"):把地址字段(比如fc00:6666::1/64)按/拆成两部分,存在数组p里——p[1]是地址主体,p[2]是前缀长度
  • substr(p[1], 1, index(p[1], "::")+1):从地址主体里截取到::为止的部分,拿到前缀核心
  • printf:把前缀核心和长度拼接成fc00:6666::/64的格式输出

方法2:用sed提取

如果更习惯sed工具,试试这条命令:

ip -6 a show dev wlan0 | sed -n '/inet6.*global/s/.*inet6 \([0-9a-f:]\+::\).*\/\([0-9]\+\).*/\1\/\2/p'

逻辑说明:

  • -n:让sed只输出我们指定的内容,不打印无关行
  • /inet6.*global/:只匹配同时包含inet6和global的行
  • s/.*inet6 \([0-9a-f:]\+::\).*\/\([0-9]\+\).*/\1\/\2/:把行内内容替换成目标格式——捕获inet6 后的xxxx::段,以及/后的数字长度,再将两部分拼接
  • p:打印处理后的结果

特殊情况处理:前缀非xxxx::格式

如果你的全局地址是fc00:6666:1:2::3/64这类格式,要提取对应64位前缀fc00:6666::/64,用这条awk命令:

ip -6 a show dev wlan0 | awk '/inet6/ && /global/ {split($2, p, "/"); split(p[1], parts, ":"); prefix=""; for(i=1;i<=2;i++){prefix=prefix parts[i] ":"}; printf "%s::/%s\n", prefix, p[2]}'

原理是把地址按:拆分成段,取前两段后拼接成xxxx:yyyy::的格式,再加上前缀长度。

内容的提问来源于stack exchange,提问作者Franck 38

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:25:03