什么是正则表达式

  正则表达式是你定义的、Linux工具用来过滤文本的模式模板。Linux工具(如grep,egrep)能

够在数据流向工具时对数据进行正则表达式模式匹配。如果数据匹配模式,它就会被接受并进一

步处理。如果数据不匹配模式,它就会被过滤掉。示意图如下:

grep、egrep及相应的正则表达式和用法

正则表达式基本知识

  正则表达式的实现是依靠正则表达式引擎来实现的。

什么是正则表达式引擎?它是解释正则表达式模式并使用该模式进行文本匹配的底层软件。

  Linux中有两种主流正则表达式:

    BRE:基本正则表达式;

    ERE:扩展正则表达式;

  学习正则表达式首先要了解正则表达式的元字符。

grep、egrep及相应的正则表达式和用法

   ERE元字符与BRE类似,写法更简洁并增加新的元字符。

grep、egrep及相应的正则表达式和用法

  以上元字符将通过grep(BRE)和egrep(ERE)逐个演示

grep命令简介

  grep家族:

    grep:支持基本正则表达式;

    egrep:支持扩展正则表达式;

    fgrep:不支持正则表达式;

  grep命令:

    grep [OPTIONS] PATTERN [FILE...];

    grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...];

  常用参数:

参数 含义
--color=auto 对匹配到的文本着色后高亮显示
-i 忽略字符大小写
-v 反向匹配
-o 仅显示匹配到的文本自身
-E 支持扩展的正则表达式
-q 静默模式,不输出任何信息

  egrep命令:

    相当于grep -E 使用方式与grep相似;

正则表达式练习

练习说明

  下列练习都大多数没有给出文字解释,个人认为解释是没必要的,一切都在做中学,不理解的

地方仿照例子写几个测试多做几次,这比文字解释更直观。

grep参数使用练习:

  -i忽略大小写:

grep、egrep及相应的正则表达式和用法

  -v反向匹配:

grep、egrep及相应的正则表达式和用法

  -o只显示匹配内容:

grep、egrep及相应的正则表达式和用法

  -q静默模式:

grep、egrep及相应的正则表达式和用法

BRE元字符练习

  .匹配单个字符

grep、egrep及相应的正则表达式和用法

  []匹配范围内的任意单个字符

grep、egrep及相应的正则表达式和用法

  []特殊字符

grep、egrep及相应的正则表达式和用法

  [^ ]匹配范围外的任意单个字符

grep、egrep及相应的正则表达式和用法

  *匹配前面的字符任意次(0,1或多次)

grep、egrep及相应的正则表达式和用法

  \+匹配前面的字符至少1次(不要忘了“\”)

grep、egrep及相应的正则表达式和用法

  \?匹配前面的0次或1次(不要忘了“\”):

grep、egrep及相应的正则表达式和用法

  \{m\}其前面的字符出现m次,m为非负整数(不要忘了“\”)

  \{m.n\}其前面的字符出现m次,m为非负整数;[m,n]

grep、egrep及相应的正则表达式和用法

  ^行首匹配

grep、egrep及相应的正则表达式和用法

  $行尾匹配

grep、egrep及相应的正则表达式和用法

  \<或\b匹配单词左侧

  \>或\b匹配单词右侧

  \<word\>匹配整个单词

grep、egrep及相应的正则表达式和用法

  \(x\)将此x匹配到的字符当作整体进行处理

  \n:第n个括号的匹配模式所匹配到的内容

  要求匹配like...liker和love...lover

grep、egrep及相应的正则表达式和用法

  这个需要说明下,按照需求第一印象的匹配方案是l.*e.*l.*r,但这样会匹配love..liker,

like...lover。

  如果要避免这样的问题,后一个单词的匹配必须使用第一个匹配单词的结果。也就是当

匹配到like后,将like保存,在第二个匹配是直接加上r使用(第二个匹配模式变为liker)。

所以\(like\)的意思就是匹配到like后,将like保存,通过\1(引用第一个括号匹配到的内容)

来建立第二个liker匹配模式。

--------------------------------------------------------------------------------------------

egrep练习

  egrep使用扩展正则表达式,所以很多元字符可以简写,如()、{}、+、?。下面补充"|"的

示例,其他的以综合练习为主。

  |匹配左边后右边

grep、egrep及相应的正则表达式和用法

---------------------------------------------------------------------------------------------

综合练习1

  找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行

grep、egrep及相应的正则表达式和用法

综合练习2

  找出"fdisk  -l“命令的结果中,包含以/dev/后跟sd或hd及一个小字母的行

grep、egrep及相应的正则表达式和用法

综合练习3

  找出”ldd  /usr/bin/cat“命令的结果中文件路径

grep、egrep及相应的正则表达式和用法

综合练习4

  echo输出一个绝对路径,使用egrep取出其基名

grep、egrep及相应的正则表达式和用法

  遇到的问题

    之前做的时候没有考虑到目录情况,当时的解决方案是第一条指令,当换成目录就就失灵了。

  修改方案

    在$前添加/?(/出现0或1次)就完美解决。

综合练习5

  找出ifconfig命令结果中的1-255之间的整数

方案1

grep、egrep及相应的正则表达式和用法

  问题

    出现超出255的数字和非单个数字

  分析原因

    从上图可以看出,默认下[0-9]进行全匹配

grep、egrep及相应的正则表达式和用法

  解决方案

    加上单词边界,就明确指定了要匹配数字的位数

grep、egrep及相应的正则表达式和用法

  最终方案

grep、egrep及相应的正则表达式和用法

综合练习6

  添加用户bash、testbash、basher及nologin,要求前三个用户的默认shell为/bin/bash,

nologin的默认shell为/sbin/nologin,而后找出其用户名与shell名相同的用户

grep、egrep及相应的正则表达式和用法

综合练习7

  匹配电话号码,模板如下:

(123)456-789

(123) 456-789

123-456-789

123.456.789

grep、egrep及相应的正则表达式和用法

综合练习8

  找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行

grep、egrep及相应的正则表达式和用法

尾巴

  正则表达式要想达到熟练应用,必须经过大量练习,今后看到好的习题会追加到该文章。

  Learn Linux The Hard Way!