基础表达式 | ||
标识 | 说明 | 举例 |
^ | :表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。 | 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 结果如下: |
连续次数匹配 | |
* | 表示前面的字符连续出现任意次,包括0次。 |
. | 表示任意单个字符。 |
.* | 表示任意长度的任意字符,与通配符中的*的意思相同。 |
\? | 表示匹配其前面的字符0或1次 |
\+ | 表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。 |
\{n\} | 表示前面的字符连续出现n次,将会被匹配到。 |
\{x,y\} | 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只要之前的字符连续出现的次数在x与y之间,即可被匹配到。 |
\{,n\} | 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。 |
\{n,\} | 表示之前的字符连续出现至少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表示匹配单个非空白字符 |
分组与后向引用 | |
\( \) | 表示分组,我们可以将其中的内容当做一个整体,分组可以嵌套;注意小括号是英文状态的 |
\( ab\) | 表示将ab当做一个整体去处理。 |
\1 | 表示引用整个表达式中第1个分组中的正则匹配到的结果。 |
\2 | 表示引用整个表达式中第2个分组中的正则匹配到的结果。 |
注意:后向引用的排序号仅仅按照分组符号的左侧部分排序,分组符号的右侧部分不算在排序范围内。 |
常见符号转义 | |
符号 | 如何转义 |
. | ”\.”就表示单个”点” |
* | ”\*”就表示单个”星” |
? | 匹配问号本身,只需要使用”?”即可 |
+ | 匹配加号本身时,直接使用”+” |
\ | 反斜杠前面加上反斜杠即\\;注意此处正则使用用单引号例如:grep 'a\\\\ ' reg.txt 匹配的是a\\;若使用双引号会报错; |
举例:
[root@hy ~]# cat regmob.txt
张三 13691234567
李四 13522223333
王五 13698766789
赵二 13933332222
傻子 13666666889999
1、要匹配出上述文件中是手机号的行
说明:两端的”\b”表示锚定词首与锚定词尾,词首以136开头,后边匹配8个数字锚定词尾;
问题:如何匹配以136或139开头的手机号呢?
大家看下下边写法与上边写法有啥不同?egrep 或者grep -E 扩展正则表达式用法
2、从ifconfig命令的结果中找出IPV4格式的IP地址
[root@hy ~]# ifconfig | grep "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"
说明:
”\([0-9]\{1,3\}\.\)”,它表示一个最少为1位数字,最多为3位数字的字符串,并且这个字符串后面跟随了一个”点”,我们把这个带有点的数字字符串当做一个整体;
”\{3\}”,它表示之前的字符需要连续出现3次,当它与红色部分的正则结合在一起时,表示符合红色部分正则的字符串需要连续出现3次;
”[0-9]\{1,3\}”,它表示一个最少为1位数字,最多为3位数字的字符串;
当上述三部分正则结合在一起时,就能表示一个类似IPV4地址的字符串(此处暂不考虑1到254的取值范围)。
考虑1-254的情况:
IPV4必须满足以下四条规则:
1、任何一个1位或2位数字,即0-99;
2、任何一个以1开头的3位数字,即100-199;
3、任何一个以2开头、第2位数字是0-4之间的3位数字,即200-249;
4、任何一个以25开头,第3位数字在0-5之间的3位数字,即250-255。
这样把规则全部罗列出来之后,构造一个正则表达式的思路就清晰了。
首先满足第一条规则的正则是:[0-9]{1,2}
首先满足第二条规则的正则是:1[0-9]{2}
首先满足第三条规则的正则是:2[0-4][0-9]
首先满足第四条规则的正则是:25[0-5]
把它们组合起来,就得到一个匹配0-255数字的正则表达式了:
([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|( 25[0-5])
IPV4由四组这样的数字组成,中间由.隔开,或者说由三组数字和字符.和一组数字组成,所以匹配IPV4的正则表达式如下:
ifconfig | grep -E "((([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\.){3}(([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))"