正则表达式实践

正则表达式通常用来检索、替换符合匹配某个模式的文本。

字符匹配
. 代表任意单个字符,一个字母、数字或汉字等
[ ] 代表指定范围内的字符, [abc]表示a,b,c 这3个字母中的任意一个
[^ ] 表示排除[ ] 中的字符以外的字符

[:alnum:] 所有大小写字母和数字,数量1
[:alpha:] 所有大小写字母,数量1
[:blank:] 代表空格和TAB,数量1
[:digit:] 代表数字 0-9,数量1
[:graph:] 代表可打印的非空白字符,数量1
[:lower:] 所有小写字母,数量1
[:print:] 所有可打印字符,数量1
[:punct:] 所有标点符号,数量1
[:upper:] 所有大写字母,数量1

实验1:往文本文件aaa 存放了若干字符串,尝试匹配出类似IP地址特征的字符串

1.1.1.1
[root@oracle ~]# cat aaa
123.222.1.0
123.222.1.a
b123.222.1.a
b.b.1.b
b.1.1.b
1.1.1.1
.2.1.2.2
[root@oracle ~]# cat aaa | grep "^ [0-9] \{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}$"
123.222.1.0
1.1.1.1

当然,头尾如果不加控制首字符锚定^和尾部锚定$ 就会出现不准确的情况

[root@oracle ~]# cat aaa | grep "[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}$"
123.222.1.0
1.1.1.1
.2.1.2.2
[root@oracle ~]# cat aaa | grep "[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}"
123.222.1.0
123.222.1.a
b123.222.1.a
1.1.1.1
.2.1.2.2

实验2:从网卡信息中匹配出类似IP地址的字符串

[root@oracle ~]# ifconfig | grep "[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}$"
          inet addr:192.168.97.185  Bcast:192.168.99.255  Mask:255.255.252.0
          inet addr:127.0.0.1  Mask:255.0.0.0

当看到00:50:56:85也被匹配的时候觉得很奇怪,后来才意识到自认为 "."作为连接符,其实.是代表任何一个字符。

[root@oracle ~]# ifconfig | grep -o "[0-9]\{1,3\}"."[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}"
00:50:56:85
192.168.97.185
192.168.99.255
255.255.252.0
47588670
23555188
4089882108
4806630348
127.0.0.1
255.0.0.0
63794003
63794003
75216216011
75216216011

于是想到用转义字符. 才正确得到结果

[root@oracle ~]# ifconfig | grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"
192.168.97.185
192.168.99.255
255.255.252.0
127.0.0.1
255.0.0.0

实验3:分组

[root@oracle ~]# echo rootrootroottt | grep "\(root\)\{3\}"
rootrootroottt

实验4:显示/etc/passwd中的两位或三位数

bash[root@oracle ~]# getent passwd | grep -o "\<[0-9]\{2,3\}\>" | sort -n

虽然 grep “[0-9]{2,3}” /etc/passwd也能匹配,但因为grep是包含,所以四位数也会被匹配到
因此要卯丁锚定词首和词尾 < 和 >

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值