Linux基础知识之正则表达式、grep、egrep的用法

  由于正则表达式比较抽象,因此本文主要以示例的形式,并结合grep和egrep让读者明白正则表达式的具体用法。重点内容会以红色字体标注,(注:贴图中的红色字体仅仅是高亮字体,与这无关)例题链接将会以蓝色字体出现请读者留意。

正则表达式:

  • 正则表达式的分类:正则表达式分为基础正则表达式扩展正则表达式

基础正则表达式的特殊字符:

  • 代表单个字符的特殊字符                  看例题前请先点我

  1.   .    代表任意的一个单个字符           我是同grep配套的.的用法

  2.  []    代表指定范围内的单个字符         我是同grep配套的[]的用法及[]用法的补充

  3.  [^]   代表指定范围之外的单个字符       我是同grep配套的[^]的用法

  • 代表多个字符的特殊字符

  1.   *    代表重复其前字符任意次             举例       注意:这里的任意次包含零次

  2.  .*    代表任意长度的任意字符             举例       注意:可以这么理解,“*”是重复其前字符任意次,“*”前面字符是“.”,“.”的意思是代表任意一个单个字符,因此“.*”便是代表任意长度任意字符

  3.  \?    代表重复?前面字符0次或1次         举例       注意:“\"是转义字符,由于“?”在文件名通配中有与在正则表达式中不同的含义,为了加以区分,所以要用“\”将其转义,因此就是你看到的“\?”的写法了

  4. \{m,n\} 代表重复其前字符至少m次,至多n次  举例        注意:这里“\”是转义其后“{”和“}”的含义,因为“{}”在文件名通配中有与在正则表达式中有不同的含义,因此加以区分

  • 代表位置锚定的特殊字符

  1.   ^      行首锚定  表示此字符“^”后的字符串必须作为行首出现           举例

  2.   $      行尾锚定  表示此字符“$”前的字符串必须作为行尾出现           举例

  3. \<或\b   词首锚定  表示次字符“\<”其后的内容必须作为单词的首部出现    举例      

  4. \>或\b   词尾锚定  表示此字符“\>”其前的内容必须作为单词的尾部出现    举例

  • \(\)的用法

      \(\)    第一个意思:表示分组  第二个意思:表示后向引用                举例

扩展正则表达式的特殊字符:

  • 代表单个字符的特殊字符 用法同基础正则表达式的一样

  1.   .    代表任意的一个单个字符      
  2.  []    代表指定范围内的单个字符        
  3.  [^]   代表指定范围之外的单个字符
  • 代表多个字符的特殊字符

  1.  *     代表重复其前字符任意次          

  2.  ?    代表重复其前字符0次或1次        注意:这里并没有加“\”,要与之前基础正则表达式区分开

  3.  +     代表重复其前字符至少1次         grep与egrep的举例及+号的用法            

  4. {m,n} 代表重复其前字符至少m次,至多n次注意:这里并没有加“\”,要与之前基础正则表达式区分开

  • 代表位置锚定的特殊字符  (用法同基础正则表达式的一样)

  1.   ^      行首锚定  表示此字符“^”后的字符串必须作为行首出现

  2.   $      行尾锚定  表示此字符“$”前的字符串必须作为行尾出现    

  3. \<或\b   词首锚定  表示次字符“\<”其后的内容必须作为单词的首部出现             

  4. \>或\b   词尾锚定  表示此字符“\>”其前的内容必须作为单词的尾部出现 

  • ()及 |的用法

  1.  ()    第一个意思:表示分组  第二个意思:表示在()中的内容作为整体出现 注意:这里同基础正则表达式一个意思,只是没有“\” 

  2.   |     是或(or)的意思                            举例

扩展正则表达式并没有全部举例,因为它同基础正则表达式大体相同,只是略加修改

grep是用来检索文本并将文本行显示出来的命令

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基本用法:

  • 参数-i的用法:

# grep -i 'ser' lianxi  匹配lianxi文件中符合,忽略大小写的含有ser这几个字母的行

  • 参数-v的用法:

# grep -i -v 'ser' lianxi  匹配lianxi文件中符合,不含有无论是大写还是小写的ser这几个字符

可以看到,图中没有一个红色的字符,这恰恰表明了-v的意思,是不显示被匹配到的内容

  • 参数-o的用法:

# grep -o 'Ser' lianxi  匹配lianxi文件中符合,含有Ser这几个字符的行,并只显示匹配到的字符

  • 参数-C的用法:

# grep -i -C 2 'ser' lianxi   匹配lianxi文件中符合,含有忽略大小写ser这几个字母的行,并显示其上下2行

本例第一次匹配到的行上面只显示了一行,是因为其上只有一行,具体请看上文原始图

 

 

你可能感兴趣的:(grep,表达式,基础知识,egrep)