|
有好几个帖子都提到了如何用正则表达式匹配IP地址的问题。咬文嚼字地说这些帖子的其实都是如何匹配dot-decimal方式表达的IPv4地址,即最常见的IPv4地址表达方式。
但IPv4地址的表达方式不止一种,还可以是十进制,八进制,十六进制,以点分隔的八进制,十六进制。以www.linuxsir.cn的IP地址211.93.98.20为例:
各种表达式分别为:
以点分隔的八进制:
用awk从dot-decimal换算
- echo 211.93.98.20 | awk -F. '{ printf("0%o.0%o.0%o.0%o\n", $1, $2, $3, $4) }'
复制代码
以点分隔的十六进制:
用awk从dot-decimal换算:
- echo 211.93.98.20 | awk -F. '{ printf("0x%X.0x%X.0x%X.0x%X\n", $1, $2, $3, $4) }'
复制代码
十六进制:
用awk从dot-decimal换算
- echo 211.93.98.20 | awk -F. '{ printf("0x%X%X%X%X\n", $1, $2, $3, $4) }'
复制代码
八进制:
从十六进制换算,awk+zsh(ksh)的typeset
- set -o cbases
- set -o octalzeroes
- typeset -i8 ip=`echo 211.93.98.20 | awk -F. '{ printf("0x%X%X%X%X\n", $1, $2, $3, $4) }'`
- echo $ip
复制代码
十进制:
从十六进制换算,awk+zsh(ksh)的typeset
- typeset -i10 ip=`echo 211.93.98.20 | awk -F. '{ printf("0x%X%X%X%X\n", $1, $2, $3, $4) }'`
- echo $ip
复制代码
上述都是有效的IPv4地址,甚至以点分隔,混杂了八进制,十六进制和十进制的表达都是可以的,比如:
由此可见,严格意义上的判断是否一个字符串是否是有效IPv4地址是及其困难的,尚且不论还有很多保留作特殊用途的IP段。 |
|