正则表达式通用匹配ip地址及主机检测
在使用正则表达式匹配ip地址时如果不限定ip正确格式,一些场景下可能会产生不一样的结果,比如ip数值超范围,ip段超范围等,在使用正则表达式匹配ip地址时要注意几点:
1,字符界定:使用 \<匹配 字符 \> 或 \b 匹配字符 \b ;这个作用是限定ip的长度或位数
2. 数值范围匹配 :[0-9] ,使用分组的方式,匹配字段
3. ip段的划分 :按照匹配规则一个正确的ip地址可以划分为如下几个段:
0-9段,10-99段,100-199段,200-254段;
正则表达式匹配如下:
grep -o -E "\b(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\b"
[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\.){3}
#这是匹配ip的第一段数值,包括 . ,这个匹配中可以匹配任意一个254以内开头的地址段,并且重复匹配三次
脚本中测试
#!/bin/bash echo "$1" | grep -o -E "\b(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\b" [ $? -ne 0 ] && { echo "$1 addr error"; exit 1; } ping -c 1 -w 1 $1 &> /dev/null && echo "$1 host is up !" || echo "$1 host is down !" #正确测试 [root@yufu home]# ./hostping.sh 192.168.214.2 192.168.214.2 192.168.214.2 host is up ! #错误测试 [root@yufu home]# ./hostping.sh 192.442.214.666 192.442.214.666 addr error
这个匹配方式在centos6和centos7中通用,还有一种简单粗暴的方法匹配ip,但不是非常精确,可能会匹配到其他内容:
[root@yufu home]# ifconfig | egrep -o "[0-9.]{7,}" 192.168.214.187 192.168.214.255 255.255.255.0 1052672 #匹配后的ip地址默认都在第一行,可以head指令截取 127.0.0.1 255.0.0.0
因此可以在此基础上再写一个可以实现自定检测ipd端和检查输入的正确性的主机检测脚本;
#!/bin/bash trap "exit" 2 read -p "Input addr eg: 192.168.214 : " IP echo "$IP" | grep -o -E "\b(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\.){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\b" [ $? -eq 0 ] || { echo "$IP addr error" ; exit 1; } Ipaddr=$IP for Host in $(seq 1 254) do ping -c 1 -w 1 $IP.$Host &>/dev/null if [ $? -eq 0 ];then echo -e "\033[32;1m$IP.$Host is up! \033[0m" else echo -e "\033[;31m$IP.$Host is down!\033[0m" fi done
检测测试
[root@yufu home]# ./hostping.sh Input addr eg: 192.168.214 : 172.16.0 172.16.0 172.16.0.1 is up! 172.16.0.2 is down! 172.16.0.3 is down! 172.16.0.4 is down! 172.16.0.5 is down! 172.16.0.6 is down! 172.16.0.7 is down! 172.16.0.8 is down! 172.16.0.9 is down! 172.16.0.10 is down! 172.16.0.11 is down! 172.16.0.12 is down! 172.16.0.13 is down! 172.16.0.14 is down! 172.16.0.15 is down! 172.16.0.16 is down! 172.16.0.17 is down! 172.16.0.18 is down! 172.16.0.19 is down! 172.16.0.20 is down! 172.16.0.21 is down!