正则表达式通常用来检索、替换符合匹配某个模式的文本。
字符匹配
. 代表任意单个字符,一个字母、数字或汉字等
[ ] 代表指定范围内的字符, [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是包含,所以四位数也会被匹配到
因此要卯丁锚定词首和词尾 < 和 >