”基本正则表达式”与”扩展正则表达式”大部分的符号都是一致的,下边我们用列表的方式看看区别,同时举例感受:
用法:grep -E "reg" 文本文件
基础表达式与扩展表达式通用 | ||
标识 | 说明 | 举例 |
^ | :表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。 | grep ^IP /etc/sysconfig/network-scripts/ifcfg-ens32 匹配以“IP”开头的行 |
$ | 表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配 | grep IP$ /etc/sysconfig/network-scripts/ifcfg-ens32 匹配以“IP”结尾的行 |
^$ | 表示匹配空行,这里所描述的空行表示”回车”,而”空格”或”tab”等都不能算作此处所描述的空行 | |
^abc$ | 表示abc独占一行时,会被匹配到 | grep ^NAME=\"ens32\"$ /etc/sysconfig/network-scripts/ifcfg-ens32 注意:引号要用 \" 转义 |
\<或者\b | 匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现 | grep "\<NAME" /etc/sysconfig/network-scripts/ifcfg-ens32 |
\>或者\b | 匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现 | grep "no\>" /etc/sysconfig/network-scripts/ifcfg-ens32 -n 结果如下: 将”\<“与”\>”结合在一起使用,只有当XXX是一个独立单词时候才会匹配到。 |
\B | 匹配非单词边界,与\b正好相反 | grep "no\B" /etc/sysconfig/network-scripts/ifcfg-ens32 -n 结果如下: |
以下常用符号基础正则与扩展正则相同 | |
符号 | 等同于/举例 |
. 表示匹配任意单个字符 | grep "h.l" regex.txt |
* 表示匹配前面的字符任意次,包括0次 | |
\ 表示转义符,当与正则表达式中的符号结合时表示符号本身 | |
[ ] 表示匹配指定范围内的任意单个字符 | |
[^ ] 表示匹配指定范围外的任意单个字符 | [^0-9]与[^[:digit:]]等效 [^a-z]与[^[:lower:]]等效 [^A-Z]与[^[:upper:]]等效 [^a-zA-Z]与[^[:alpha:]]等效 [^a-zA-Z0-9]与[^[:alnum:]]等效 |
[[:alpha:]] 表示任意大小写字母 | [a-zA-Z]与[[:alpha:]]等效 |
[[:lower:]] 表示任意小写字母 | [a-z]与[[:lower:]]等效 |
[[:upper:]] 表示任意大写字母 | [A-Z]与[[:upper:]]等效 |
[[:digit:]] 表示0到9之间的任意单个数字(包括0和9) | [0-9]与[[:digit:]]等效 |
[[:alnum:]] 表示任意数字或字母 | [a-zA-Z0-9]与[[:alnum:]]等效 |
[[:space:]] 表示任意空白字符,包括"空格"、"tab键"等 | |
[[:punct:]] 表示任意标点符号 | |
#简短格式并非所有正则表达式解析器都可以识别 *grep 使用时需要加上-P 选项* | |
\d 表示任意单个0到9的数字 | |
\D 表示任意单个非数字字符 | |
\t 表示匹配单个横向制表符(相当于一个tab键) | |
\s表示匹配单个空白字符,包括"空格","tab制表符"等 | |
\S表示匹配单个非空白字符 |
连续次数匹配 | ||
基础 | 扩展 | 说明 |
* | 同 | 表示前面的字符连续出现任意次,包括0次。 |
. | 同 | 表示任意单个字符。 |
.* | 同 | 表示任意长度的任意字符,与通配符中的*的意思相同。 |
\? | ? | 表示匹配其前面的字符0或1次 |
\+ | + | 表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。 |
\{n\} | {n} | 表示前面的字符连续出现n次,将会被匹配到。 |
\{x,y\} | {x,y} | 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只要之前的字符连续出现的次数在x与y之间,即可被匹配到。 |
\{,n\} | {,n} | 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。 |
\{n,\} | {n,} | 表示之前的字符连续出现至少n次,才会被匹配到. |
分组与后向引用 | ||
基础 | 扩展 | 说明 |
\( \) | () | 表示分组,我们可以将其中的内容当做一个整体,分组可以嵌套;注意小括号是英文状态的 |
\( ab\) | (ab) | 表示将ab当做一个整体去处理。 |
\1 | 同 | 表示引用整个表达式中第1个分组中的正则匹配到的结果。 |
\2 | 同 | 表示引用整个表达式中第2个分组中的正则匹配到的结果。 |
注意:扩展正则表达式中,还有一个常用的符号,是基本正则表达式中所没有的,它就是”|”,表示或的意思。
举例:匹配比较标准合法的邮箱地址,要求:
1、邮箱字符串中必须包含”@”符。
2、”@”符前面的字符只能是小写字母或数字,不能包含特殊符号。
3、”@”符前面的字符数量至少需要4个,至多为16个。
4、邮箱必须以”com”、”net”、”org”、”edu”等顶级域名结尾(此处为了方便演示,不判断更多的域名)。
5、顶级域名之前必须包含一个”点”,换句话说就是,邮箱必须以”.com”、”.net”、”.org”、”.edu”结尾。
6、”@”与”.”之间的字符数量不能超过12个,不能低于2个。
7、”@”与”.”之间的字符只能是小写字母或数字,不能包含特殊符号。
[root@hy ~]# cat email.txt
lht@163.com
zhang01@263.net
wang@bjqq.cn
zhaoliu@jiaoyu.edu
xiaopingguo@mailjia.org
grep -E -n "[a-z0-9]{4,16}@[a-z0-9]{2,12}\.((com)|(net)|(edu)|(org))" email.txt
①实现了条件2,②实现了条件3,③实现了条件1,④实现了条件7,⑤实现了条件6,⑥实现了条件5,⑦实现了条件4;其中lht@163.com及wang@bjqq.cn不满足条件3和4未被匹配到。