正则表达式
一、正则表达式的元字符
[root@localhost ~]#ls /etc/ | grep rc[.0-6] grep命令使用正则表达式rc[.0-6]来匹配文件名中包含rc加数字(0-6)的文件或目录名, 其中方括号[]表示字符集,[.0-6]表示匹配.和0-6这些字符中的任意一个。 #此处的点代表字符 rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.d rc.local [root@localhost ~]# ls /etc/ | grep 'rc\.' #只匹配已rc.开头的文件 #\为转义符,此处的.只表示.,不表示任意字符 rc.d rc.local [root@localhost ~]# ls /opt | grep "t." #过滤出仅包含字母"t"后跟任何其他字符的行。 [root@localhost ~]# grep 'r..t' /etc/passwd #r..t ..代表任意两个字符 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin [root@localhost ~]# echo abc |grep a.c #表示原来的点需要加\转义 abc [root@localhost ~]# echo abc |grep a\.c #使用grep正则表达式时不加引号有时匹配会有出入 abc [root@localhost ~]# echo abc |grep 'a\.c' #标准格式需要加'' 或者"" [root@localhost ~]# ls |grep '[fhtx].txt' #匹配[]中任意一个字符 f.txt h.txt t.txt x.txt [root@localhost ~]# ls [a-d].txt #通配符 a.txt A.txt b.txt B.txt c.txt C.txt d.txt [root@localhost ~]# ls | grep '[a-d].txt' #真正的小写在正则表达式中 a.txt b.txt c.txt d.txt [root@localhost ~]# ls |grep '[^a-z].txt' #显示非小写字母 A.txt B.txt [root@localhost ~]# ls |grep '[^a.z].txt' #“[^a.z]”表示不匹配字母“a”或“z”的任何字符(取反) space空格 [root@localhost ~]# grep [[:space:]] 123.txt hhh jj l kkk [a-zA-Z] #表示同时匹配大小写
二、表示次数
2.1 *: 匹配前面的字符任意次,包括0次
[root@localhost ~]# echo ac |grep 'ab*c' #ab之间不输入b可匹配 ac [root@localhost ~]# echo abc |grep 'ab*c' #ab之间输入1个b可匹配 abc [root@localhost ~]# echo abbc |grep 'ab*c'#ab之间输入2个b可匹配 abbc
2.2 .* : 任意长度的任意字符,不包括0次,也就是匹配所有
[root@localhost ~]# echo ac |grep 'ab.*c' #ac之间不输入b匹配不到 [root@localhost ~]# echo abc |grep 'ab.*c' #ac之间输入1个b可以匹配 abc [root@localhost ~]# echo abbc |grep 'ab.*c' #ac直接输入2个b可以匹配 abbc
2.3 ?: 匹配其前面的字符出现0次或1次,即:可有可无
[root@localhost ~]# echo ac | grep 'ab\?c' #ac之间不输入b可以匹配 ac [root@localhost ~]# echo abc | grep 'ab\?c' #ac之间输入1个b可以匹配 abc [root@localhost ~]# echo abbc | grep 'ab\?c' #ac之间输入2个b匹配不到
2.4 \+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
[root@localhost ~]# echo ac | grep 'ab\+c' #ac之间不输入b匹配不到 [root@localhost ~]# echo abc | grep 'ab\+c' #ac之间输入1个b可以匹配 abc [root@localhost ~]# echo abbbbc | grep 'ab\+c' #ac之间输入多个b可以匹配 abbbbc
2.5 \{n} #匹配前面的字符=n次
[root@localhost ~]# echo abbbc |grep 'ab\{3\}c' #输出abbbc匹配ac之间b字符出现3次可以匹配 abbbc [root@localhost ~]# echo abbbbc |grep 'ab\{3\}c' #输出abbbbc匹配ac之间b字符出现3次匹配不到
2.6 \{m,n\} #匹配前面的字符至少m次,至多n次
[root@localhost ~]# echo abc |grep 'ab\{1,3\}c' #输出abc匹配ac之间b出现最少1次最多3次可以匹配 abc [root@localhost ~]# echo abbc |grep 'ab\{1,3\}c' #输出abbc匹配ac之间b出现最少1次最多3次可以匹配 abbc [root@localhost ~]# echo abbbc |grep 'ab\{1,3\}c'#输出abbbc匹配ac之间b出现最少1次最多3次可以匹配 abbbc [root@localhost ~]# echo abbbbc |grep 'ab\{1,3\}c'#输出abbbbc匹配ac之间b出现最少1次最多3次匹配不到
2.7 \{,n\} #匹配前面的字符至多n次,<=n
2.8 \{n,\} #匹配前面的字符至少n次
三、位置锚定
[root@localhost ~]# cat a.txt #查看a.txt内容 root abc abd abf abe asfase asdfasfewe [root@localhost ~]# cat a.txt |grep '^a' #查看a.txt内容过滤以a开头的行 abc abd abf abe asfase asdfasfewe [root@localhost ~]# cat a.txt |grep 'e$' #查看a.txt内容过滤以e为结尾的行 asfase asdfasfewe [root@localhost ~]# cat a.txt |grep '^root$' #查看a.txt内容过滤只有root字符的行 root [root@localhost ~]# cat a.txt |grep '\ba' #查看a.txt过滤以a开头的词 abc abd abf abe asfase asdfasfewe [root@localhost ~]# cat a.txt |grep 'e\b' #查看a.txt过滤以e为结尾的词 abc abd abf abe asfase asdfasfewe [root@localhost ~]# cat a.txt |grep -o '\babc\b' #查看a.txt过滤次abc abc
四、分组
()将多个字符捆绑在一起当做一个整体处理
[root@localhost ~]# echo abcccc |grep "abc\{4\}" #匹配输出内容c出现4次 abcccc [root@localhost ~]# echo abcccc |grep "\(abc\)\{4\}" #abc字符加()分组匹配输出内容abc出现4次,无abc出现4次匹配不到 [root@localhost ~]# echo abcabcabcabc |grep "\(abc\)\{4\}" #abc字符加()分组匹配输出内容abc出现4次匹配成功 abcabcabcabc
五、扩展正则表达式
grep -E 或 sed -r 或 egrep
将test.txt中的内容用扩展正则表达式输出 [root@localhost ~]# cat test.txt 987-123-4567 987 456-1230 (123) 456-7890 [root@localhost ~]# cat test.txt | grep -E "(\([0-9]+\)|[0-9]+)[ -]?[0-9]+[ -]?[0-9]+"