如何在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
相关产品推荐
相关产品推荐

