正则表达式最早出现于unix系统当中,它主要用途是文本的检索。现在很多的文本编辑器,大部分主流操作系统,大部分的编程语言都支持正则表达式的使用,它的身影可谓无处不在。因此正则表达式的应用是计算机科学学习当中必须掌握的基本技能之一。

     正则表达式是由特定字符按照某种规则进行组合,并以此实现(文本)逻辑过滤。那么,对这个“规则”的思考与理解就是学习正则表达式的核心。

     grep: (Global search REgular expression and Print out the line)是linux下的文本搜索工具,它根据用户指定的文本模式(正则表达元字符以及正常字符组合而成)对目标文件进行逐行搜索,并显示能匹配到的行。


grep命令形式及常用选项如下:

 

--color[=WHEN], --colour[=WHEN]
   auto
   always
   never

-i:   ignore case,不区分字符大小写

-v:  显示不能够被模式匹配到的行

-E: 使用扩展的正则表达式

    正则表达式:是由元字符及一般字符所书写的模式,其中的元字符不表示字符本身的意义,而是用于表达控制或通配等功能。

    基本正则表达式元字符:

字符匹配:

[0-9], [[:digit:]] 数字
 [a-z], [[:lower:]] 小写字母
 [A-Z], [[:upper:]] 大写字母
 [[:space:]] 空白字符
 [[:punct:]] 
 [0-9a-zA-Z], [[:alnum:]] 所有数字和字母
 [a-zA-Z], [[:alpha:]] 字母

次数匹配:在期望匹配字符后面提供一个控制符,用于表达匹配其前面字符指定的次数

*  : 任意长度,表示0次、1次或多次;

.*: 任意长度的任意字符


\?:0次或1次;表示其左侧字符可有可无
 
 \+: 1次或多次;表示其左侧字符至少出现1次;
 \{m\}:m次;表示其左侧字符精确出现m次;
 \{m,n\}:至少m次,至多n次;
 \{0,n\}:至多n次;
 \{m,\}:至少m次;

位置锚定:

^PATTERN

     单词锚定:由非特殊字符组成的连续的字符串



\<PATTERN\>:匹配PATTERN能匹配到的整个单词

分组:\(\)

分组中的模式,在某次的具体匹配过程中所匹配到的字符,可以被grep记忆(保存于   内置的变量中,这些变量是\1, \2, ...),因此,还可以被引用;

\1: 引用,模式中自左而右,由第一个左括号以及与之对应的右括号中的模式所匹配到的内容;

\2: 引用 ,模式中自左右,由第二个左括号以及与之对应的右括号中的模式所匹配到的内容;

例如:

      1:显示etc目录下的passwd文件中包含至少四个连续数字的行;

 

grep “[0-9]\{4\}” /etc/passwd
 
         Grep –v “bash$” /etc/passwd

      3: 显示etc目录下sos.conf文件中以#开头且包含至少一个空白字符并且以字母结尾的行;

       

Grep –I “^#.*[:space:]\+.*[a-z]$” /etc/sos.conf

扩展的正则表达式:

字符匹配:

[^]

次数匹配:

*: 任意次

?:0或1次

+: 至少1次

{m}:精确匹配m次;

{m,n}:至少m次,至多次;

{m,}:至少m次;

{0,n}:至多次;

位置锚定:

^

$

\<, \b

\>, \b

分组:

()


引用:\1, \2, ...

或者:

a|b:a或者b

或者两侧的所有内容;


命令:

grep -E PATTERN FILE...

egrep PATTERN FILE...

     正则表达式与扩展正则表达式的区别仅仅是部分去除了转义字符 “\”,

其格式基本一样。

    正则表达式关键在于灵活,以及结合管道命令之类的综合运用。做到这两点,才是真正的掌握好正则表达式,这一切的基础便是多加练习。



转载于:https://blog.51cto.com/lizhihua015/1631806