在Bash脚本中处理路由表获取的路由器IP,如何删除其最后一位?
解决Bash中提取IP网段前缀的问题
嘿,这个需求在网络扫描脚本里太常见了!我给你分享几个简单又可靠的方法,帮你去掉路由器IP的最后一位,生成网段前缀:
方法1:用cut命令(最直观)
cut命令专门用来分割文本,按点分隔IP后取前三个字段就行,代码超简洁:
# 先获取路由器IP first_ip=$(route -n | awk 'NR>2{print $2}' | head -1) # 提取网段前缀(比如把192.168.1.1变成192.168.1) ip_prefix=$(echo "$first_ip" | cut -d '.' -f 1-3)
解释一下:-d '.'指定用点作为分隔符,-f 1-3表示取第1到第3个字段,完美得到我们需要的网段前缀。
方法2:用awk处理(灵活可控)
如果你本来就熟悉awk,也可以直接在提取IP的环节顺便处理,或者单独处理:
# 方式A:单独处理已获取的IP ip_prefix=$(echo "$first_ip" | awk -F '.' '{print $1"."$2"."$3}') # 方式B:合并到路由表提取的命令里,一步到位 ip_prefix=$(route -n | awk 'NR>2{split($2, arr, "."); print arr[1]"."arr[2]"."arr[3]}' | head -1)
这里用split函数把IP拆成数组,然后拼接前三个元素,适合需要对IP做更多自定义处理的场景。
方法3:用sed正则替换(正则爱好者首选)
用正则匹配最后一个点及后面的数字,直接替换为空:
ip_prefix=$(echo "$first_ip" | sed 's/\.[0-9]*$//')
正则说明:\.[0-9]*$匹配结尾处的一个点,加上任意数量的数字,替换成空就去掉了最后一段。
最后,生成连续IP的循环示例
拿到前缀后,就可以用循环生成整个网段的IP了:
for ip in $(seq 1 254); do echo "$ip_prefix.$ip" # 这里可以加你的扫描逻辑,比如ping或者nmap done
内容的提问来源于stack exchange,提问作者Game Area 88
相关产品推荐
相关产品推荐

