如何从IP/Block地址中拆分IP与网段并分别存入Bash变量?
拆分IP/网段地址的几种bash实现方法
嘿,我来帮你搞定这个IP和网段拆分的问题!你现在用basename的思路不对哦,它是用来处理文件名路径的,咱们换几种更适合字符串拆分的方法,都能得到你想要的address="100.100.40.160"和block="29"结果:
方法1:用bash内置参数扩展(最推荐,无外部命令)
这种方法不需要调用任何外部工具,纯bash内置功能,执行效率最高:
#!/bin/bash ipblock="100.100.40.160/29" # 提取IP:删除从第一个/开始到结尾的所有内容 ipaddress="${ipblock%%/*}" # 提取网段:删除从开头到最后一个/的所有内容 block="${ipblock##*/}" echo "address=\"$ipaddress\"" echo "block=\"$block\""
简单解释下语法:
${var%%/*}:%%表示最长匹配删除后缀,这里匹配/*(即从/开始的任意内容),所以会删掉第一个/及后面的所有字符,留下前面的IP${var##*/}:##表示最长匹配删除前缀,这里匹配*/(即任意内容到/结束),所以会删掉最后一个/及前面的所有字符,留下后面的网段
方法2:用cut命令拆分
如果习惯用文本处理工具,cut是个简单的选择:
#!/bin/bash ipblock="100.100.40.160/29" # 按/分割,取第一个字段(IP) ipaddress=$(echo "$ipblock" | cut -d '/' -f 1) # 按/分割,取第二个字段(网段) block=$(echo "$ipblock" | cut -d '/' -f 2) echo "address=\"$ipaddress\"" echo "block=\"$block\""
cut -d '/' -f 1的意思是:以/作为分隔符,输出第1个字段。
方法3:用awk命令处理
awk在文本处理上更灵活,也能轻松搞定:
#!/bin/bash ipblock="100.100.40.160/29" # 按/分割后,把两个字段分别赋值给变量 read ipaddress block <<< $(echo "$ipblock" | awk -F '/' '{print $1, $2}') echo "address=\"$ipaddress\"" echo "block=\"$block\""
或者更直接一点,用awk直接输出结果:
ipblock="100.100.40.160/29" awk -F '/' '{printf "address=\"%s\"\nblock=\"%s\"\n", $1, $2}' <<< "$ipblock"
内容的提问来源于stack exchange,提问作者Vituvo
相关产品推荐
相关产品推荐

