Chinaunix首页 | 论坛 | 博客
  • 博客访问: 54836
  • 博文数量: 11
  • 博客积分: 1515
  • 博客等级: 上尉
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 13:16
文章分类

全部博文(11)

文章存档

2010年(11)

分类:

2010-08-21 15:34:19

1Shell下的ip 地址正则表达式匹配

 

我的思路  

 

1最简单的当然是这样  可以工作  而且可以应付大部分情况了 

if [[ "${!temp}" =~ \

"^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" ]]

 

缺点很明显  因为ip 地址是0~255   而不是0~999

 

2那么这样写

[0-2]?[0-5]?[0-5]?   那么? 代表的是0个或者1个数字  有可能?要加转义符\

那么 这样写问题更大

 

首先没有数字的时候   比如.7.8.9这样  居然通过了 这样不行

其次66 这样的数字报错

 

3所以改写为

(2[0-5][0-5]|1[0-9][0-9]|[1-9]?[0-9])       1|2|3)这种格式

表示3种情况

第一种是200     范围200  ~255

第二种为100     范围100~199

第三种为十位数和个位数的情况  之所以为1-9而不是0-9 为十位数

是因为 如果是0的话 那么 0[1-9]即可代表

范围为 0~99

 

 

问题不少

 2[0-5][0-5] 那么 249这样的就不存在了

 

必须分解2[0-4][0-9]|25[0-5]  2

 

最终为(2[0-4][0-9]|25[0-5] |1[0-9][0-9]|[1-9]?[0-9])

 

如果扩展为1.2.3.4形式

 

那么应该写为

regex_ip="(2[0-4][0-9]|25[0-5] |1[0-9][0-9]|[1-9]?[0-9])(\.(2[0-4][0-9]|25[0-5] |1[0-9][0-9]|[1-9]?[0-9])){3}"

 

意思是 (0-255)(点号  0-255)3

 

实验一下

#!/bin/bash

 

#ip的正则表达式匹配

regex_ip="(2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[1-9]?[0-9])(\.(2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[1-9]?[0-9])){3}"

 

echo "123.1.1.1" |grep -E "$regex_ip"

 

注意1  因为用到了扩展正则  ()   |  ?所以 grep必须加 –E

如果是 if [[ =~ ]]模式就不用加什么参数了  都能识别的

 

2小心  不要乱加空格 有时候导致错误  就是因为一个不起眼的空格 导致全部出错

比如 刚才[0-5] |之间这个不起眼的空格 导致整个 表达式不对  [[]] 出错  

 

3 "^${regex_ip}$"这样写正确吗? 

正确的  因为$结尾匹配必定是放在最后的  解释器分得清楚 前面的$是变量符号 因为它会根据这个符号抓后面的变量   而最后的$识别为正则表达式

阅读(3295) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~