由于正则表达式比较抽象,因此本文主要以示例的形式,并结合grep和egrep让读者明白正则表达式的具体用法。重点内容会以红色字体标注,(注:贴图中的红色字体仅仅是高亮字体,与这无关)例题链接将会以蓝色字体出现请读者留意。
正则表达式的分类:正则表达式分为基础正则表达式和扩展正则表达式。
基础正则表达式的特殊字符:
代表单个字符的特殊字符 看例题前请先点我
. 代表任意的一个单个字符 我是同grep配套的.的用法
[] 代表指定范围内的单个字符 我是同grep配套的[]的用法及[]用法的补充
[^] 代表指定范围之外的单个字符 我是同grep配套的[^]的用法
代表多个字符的特殊字符
* 代表重复其前字符任意次 举例 注意:这里的任意次包含零次
.* 代表任意长度的任意字符 举例 注意:可以这么理解,“*”是重复其前字符任意次,“*”前面字符是“.”,“.”的意思是代表任意一个单个字符,因此“.*”便是代表任意长度任意字符
\? 代表重复?前面字符0次或1次 举例 注意:“\"是转义字符,由于“?”在文件名通配中有与在正则表达式中不同的含义,为了加以区分,所以要用“\”将其转义,因此就是你看到的“\?”的写法了
\{m,n\} 代表重复其前字符至少m次,至多n次 举例 注意:这里“\”是转义其后“{”和“}”的含义,因为“{}”在文件名通配中有与在正则表达式中有不同的含义,因此加以区分
代表位置锚定的特殊字符
^ 行首锚定 表示此字符“^”后的字符串必须作为行首出现 举例
$ 行尾锚定 表示此字符“$”前的字符串必须作为行尾出现 举例
\<或\b 词首锚定 表示次字符“\<”其后的内容必须作为单词的首部出现 举例
\>或\b 词尾锚定 表示此字符“\>”其前的内容必须作为单词的尾部出现 举例
\(\)的用法
\(\) 第一个意思:表示分组 第二个意思:表示后向引用 举例
扩展正则表达式的特殊字符:
代表单个字符的特殊字符 (用法同基础正则表达式的一样)
代表多个字符的特殊字符
* 代表重复其前字符任意次
? 代表重复其前字符0次或1次 注意:这里并没有加“\”,要与之前基础正则表达式区分开
+ 代表重复其前字符至少1次 grep与egrep的举例及+号的用法
{m,n} 代表重复其前字符至少m次,至多n次注意:这里并没有加“\”,要与之前基础正则表达式区分开
代表位置锚定的特殊字符 (用法同基础正则表达式的一样)
^ 行首锚定 表示此字符“^”后的字符串必须作为行首出现
$ 行尾锚定 表示此字符“$”前的字符串必须作为行尾出现
\<或\b 词首锚定 表示次字符“\<”其后的内容必须作为单词的首部出现
\>或\b 词尾锚定 表示此字符“\>”其前的内容必须作为单词的尾部出现
()及 |的用法
() 第一个意思:表示分组 第二个意思:表示在()中的内容作为整体出现 注意:这里同基础正则表达式一个意思,只是没有“\”
| 是或(or)的意思 举例
扩展正则表达式并没有全部举例,因为它同基础正则表达式大体相同,只是略加修改
grep的用法:
# grep [options] '简单字符串或利用基础正则表达式来搜索字符串' filename
常用参数说明:
-i: 表示忽略字符大小写 举例
--colour或--color: 表示用颜色显示出来
-v: 表示匹配到的行不显示,即显示没有被检索到的内容的那一行 举例
-o: 表示只显示匹配到的字符串 举例
-E: 表示使用扩展正则表达式 即 grep -E = egrep
-A NUM: 表示被匹配到的内容并显示其之后的NUM行
-B NUM: 表示被匹配到的内容并显示其之前的NUM行
-C NUM: 表示被匹配到的内容并显示其上下的NUM行 举例
egrep的用法:
grep -E =egrep
# egrep [options] '简单字符串或利用扩展正则表达式来搜索字符串' filename
关于举例的声明:除了个别例题外,大部分例题是在下图为参照图进行实验对比的,请各位留意。
原始图:在root目录下新建文件lianxi,lianxi中的内容即为下图
为了方便查看我们使用# alias grep='grep --color'来让匹配到的字符着色
下文中匹配到的字符会以红色显示出来
"."的用法:
# grep '.f.' lianxi 搜索lianxi文件中,行中满足.f.的文本行,即行内必须要出现“f”,而f前后两个字符为任意单个字符
[]的用法:
# grep 'S[a-z]rv[a-f]' lianxi 搜索lianxi文件中,行内满足S[a-z]rv[a-f]的文本行,即行内必须出现S字符,后面紧跟从a到z的任意一个字符,然后是rv字符,最后是从a到f之间的任意一个字符
搜索并没有出现
因为Ssrvice不满足在rv字符后面紧跟[a-f]之间的一个字符这个条件
在这里要补充的是正则表达式中[]中表示数字范围,字母范围,空白行的写法
[:space:]:表示空白字符
[:punct:]:表示所有标点符号的集合
[:lower:]:表示所有的小写字母的集合
[:upper:]:表示所有的大写字母的集合
[:alpha:]:表示大小写字母的集合
[:digit:]:表示数字的集合
[:alnum:]:表示数字和大小写字母的集合
例如[:digit:]是表示数字的集合,所以[[:digit:]]才表示在集合中取一个任意数字,因此都需要在他们外面再加上[],再例如[[:alnum:]]就相当于[0-9a-zA-Z]
[^]的用法:
# grep 'S[a-z]rv[^a-f]' lianxi 与之前的[]例题相近,只是[^a-f]加以改进,看这次显示的是什么
我们会发现正好与上题的结果相反,这便是[^]的用法
*的用法:
# grep ‘[[:digit:]]000*' lianxi 表示匹配行内包含“任意单个数字后紧跟两个零或多个零的行”
.*的用法:
# grep ‘[[:digit:]]000.*' lianxi 与*的用法作比较,我们会发现
其结果是什么都没有搜索到,因为此题的意思是匹配“任意单个数字后跟3个零,然后再跟任意长度任意字符,所以匹配不到
\?的用法:
# grep ‘[[:upper:]]1[[:digit:]]\?' lianxi 表示匹配出现任意单个大写字母后跟数字1,然后再跟任意单个数字,可以出现0次或者1次
\{\}的用法:
# grep '[0-9]\{4,\}' lianxi 表示匹配任意单个数字至少出现4次,最多次数不限制的行
\{,n\}:表示匹配其前字符至多n次
\{n,\}:表示匹配其前字符至少n次
\{n\}:表示匹配其前字符n次
^ 的用法:
# grep '^a.*' lianxi 表示匹配查找以a开头其后跟任意长度任意字符的行
$的用法:
# grep ’.*n$' lianxi 表示匹配任意长度任意字符后以n字符结尾的行
若稍作修改# grep ’^g.*n$' lianxi 则
我们可以发现只匹配这一行
\<或\b 的用法:
# grep '\<S' lianxi 表示匹配以S为词首的行,这里要注意的是Linux默认词同我们经常说的单词是两个概念,在Linux中S123asdad也算是一个词。
\>或\b的用法:
这里举两个例子,一方面对比,一方面理解词的意思
# grep '\<Serv.*e\>' lianxi 表示匹配以S为词首后跟erv,再接任意长度任意字符,以e为词首结尾的行
# grep '\<Serv.*r\>' lianxi 表示匹配以S为词首后跟erv,再接任意长度任意字符,以r为词首结尾的行
\(\)的用法:
为了特别说明我们在/root目录下创建文件名为lianxi2的文件,里面的内容是
用法一:分组
# grep ’\(caca\)\{2,\}' lianxi2 表示以caca为整体匹配至少两次的行
用法二:后向引用
# grep ’\(caca\)..\1' lianxi2 表示以caca为整体后跟两个任意单个字符,再接一个caca。 \1引用前面第一个\(\)出现的内容。若\(\)多次出现,则用\1 , \2来依次代表前面出现的\(\)
+的用法:
这里笔者写出两种方法,他们的意思是相同的
# grep -E '\(55\)+' lianxi 这是用grep的形式,基于基础的正则表达式书写的格式
# egrep '(55)+' lianxi 这是用egrep的形式,基于扩展正则表达式书写的格式
语句的意思是,匹配含有55这两个连起来的数字至少1次的行
其他的egrep的用法也可以转化为grep的形式书写
| 的用法:
egrep 'Serv(er|ic)' --color lianxi 表示匹配Serv后接er或ic的行
greb基本用法:
# grep -i 'ser' lianxi 匹配lianxi文件中符合,忽略大小写的含有ser这几个字母的行
# grep -i -v 'ser' lianxi 匹配lianxi文件中符合,不含有无论是大写还是小写的ser这几个字符
可以看到,图中没有一个红色的字符,这恰恰表明了-v的意思,是不显示被匹配到的内容
# grep -o 'Ser' lianxi 匹配lianxi文件中符合,含有Ser这几个字符的行,并只显示匹配到的字符
# grep -i -C 2 'ser' lianxi 匹配lianxi文件中符合,含有忽略大小写ser这几个字母的行,并显示其上下2行
本例第一次匹配到的行上面只显示了一行,是因为其上只有一行,具体请看上文原始图