正则表达式

正则表达式:{Regualr (有规律的)Expression(表现)正则表达式}, 简

写:REGEXP-->RE

正则表达式就是能用某种模式去匹配一类字符串的公式,它是由一串字符和元字符构成的字符串。

所谓元字符,就是用以阐述字符表达式的内容、转换和描述各种操作信息的字符。

正则表达式针对的是文本内容,而通配符针对的是文件名称。

分两类:

基本正则表达式:BRE

扩展正则表达式:ERE

grep: Global(全局) search REgular expression and Print out the

line.

作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本

逐行进行匹配检查;打印匹配到的行;

模式:由正则表达式的元字符及文本字符所编写出的过滤条件;

正则表达式引擎(httpd,nginx都有使用pcre支持正则表达式);正则表达式就是能用某种模式去匹配一类字符串的公式,它是由一串字符和元字符构成的字符串。所谓元字符,就是用以阐述字符表达式的内容、转换和描述各种操作信息的字符。

正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。简单的说,正则表示式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为, 正则表示式通过一些特殊符号的辅助,可以让使用者轻易的达到搜寻/删除/取代某特定字符串的处理程序。vim、grep、find、 awk、sed等命令都支持正则表达式。

拓展的正则表达: egrep 或者 grep -E ,使用egrep的时候,就无需再加 转义符了。

fgrep : 不支持正则表达式。

文本处理三剑客一  grep

字符匹配

. :匹配单个字符

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

匹配次数

\?:匹配前面的字符0次或一次,意味着可有可无;

*:匹配前面的字符0次或任意次

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

\+:匹配前面的字符1次或任意次,意味着至少一次

\{n\}:匹配其前面的字符n次;

\{n,m\}:匹配其前面的字符至少n次,至多m次;

\{0,n\}:匹配前面的字符至多n次

\{m,\}:至少m次

位置限定

^:行首锚定;用于模式的最左侧;(开头)

$:行尾锚定;用于模式的最右侧; (结尾)

^PATTERN$:用于PATTERN来匹配整行;

^$:空白行;

\< 或 \b:词首锚定,用于单词模式的左侧;

\> 或 \b:词尾锚定,用于单词模式的右侧;

\<PATTERN\>:匹配完整单词;

其他及特殊的POSIX字符

\w:匹配字母、数字和下划线等于[A-Za-z0-9]

\W:匹配非字母、非数字和非下划线[^A-Za-z0-9]

\n:匹配一个换行符

\r:匹配一个回车符

\t:匹配一个制表符

\s:匹配任何空白字符

\S:匹配任何非空白字符

\f:匹配一个换页符

[[:alnum:]] 文字数字字符(除去符号之外,数字、字母都可以包括中

文!)

[[:alpha:]]

文字字符(字母,包括中文)

[[:digit:]]

数字字符(阿拉伯数字)

[[:graph:]]

非空字符(排除空格、tab键)

[[:print:]]

非空字符(包括空格,空格认为非空,tab键不适用)

[[:lower:]]

小写字符[[:upper:]] 大写字符

[[:cntrl:]]

控制字符

[[:punct:]]

标点,符号(包括常用符号)

[[:space:]]

所有空白字符(新行,空格,制表符)

[[:xdigit:]]

十六进制数(0-9,a-f,A-F)

干讲理论没有实际意义下来我们结合实验来理解

Vim 建立一个文件,名字为 mytest.txt,粘贴以下内容

good good study day day up

10086

10086+1

I remember that day she got married

三个空格

三个tab建

Good afternoon everyone

you are a good man

Study hard for your future

How are you?

yuwenkedaibiao

I'm fine,thanks

go TO bed

are you ok?

It's been a long day without you my friend

You jump ,I jump!

one day ,'your girl will go '. Just because you have noting.

"you cried to me,'fairy tales are deceptive'"

\\\\\

//

()()()()()

"how do you do"

++++++++++++

###############

  1. 搜索含有thanks的行。

[root@localhost ~]# grep "thanks" mytest.txt

I'm fine,thanks

  1. 搜索以Good开头的行

[root@localhost ~]# grep "^Good" mytest.txt

Good afternoon everyone

  1. 搜索一个包含od的行,d字母可有可无,不限次数。

[root@localhost ~]# grep "od*" mytest.txt

  1. 搜索一个词,该词以y或Y开头。

[root@localhost ~]# grep "^[Yy].*" mytest.txt

5.搜素含有单引号的行。

[root@localhost ~]# grep ".*'.*'.*" mytest.txt

6. 搜索一些行,该行包括某个单词,并满足一下条件:

第一个字符可以是Y或y

第二个字符可以是o或者没有

第三个字符可以是任意字符

第四个字符匹配前一个字符,0次或任意次

[root@localhost ~]# grep "^[Yy]o\?.*" mytest.txt

You jump ,I jump!

7. 匹配以大写字母开头的行

[root@localhost ~]# grep ^[[:upper:]] mytest.txt

8. 匹配包含数字的行。

[root@localhost ~]# grep [[:digit:]] mytest.txt

9.搜索精确匹配到含有day的单词的行。

[root@localhost ~]# grep "\<day\>" mytest.txt

10. 搜索包含are you ok这一行

[root@localhost ~]# grep "are you ok" mytest.txt

11. 搜索以字母g开头包含两个o以上的单词

[root@base ~]# grep "\go\{2,\}" mytest.txt

12. 使用扩展正则表达式,搜索g和d之间至少有一个o的行

[root@localhost ~]# grep "go\+d" mytest.txt

13. 搜索++++++++的行

[root@localhost ~]# fgrep "++++" mytest.txt

14. 搜索\\或者的行

[root@localhost ~]# grep "[\/]" mytest.txt

15. 搜索带有双引号的行

[root@localhost ~]# grep ".*\".*\".*" mytest.txt

16. 搜索双引号里带有单引号的行

[root@localhost ~]# grep "\".*'.*'.*\"" mytest.txt

17. 搜索空白字符行and搜索非空白字符行,并分别统计有多少行

//空白

[root@localhost ~]# grep [[:space:]] mytest.txt

//非空(有空格也认为是空)

[root@localhost ~]# grep -c [[:graph:]] mytest.txt

22

//非空(有空格不算空、有tab键也算空)

[root@localhost ~]# grep -c [[:print:]] mytest.txt

23

18. 搜索带有标点符号的行

[root@localhost ~]# grep [[:punct:]] mytest.txt

19.搜索以y开头中间肯定有字符末尾是o的行,并显示出上下各2行的内容。

[root@localhost ~]# grep -C 2 "^y.*o$" mytest.txt