正则表达式
正则表达式:{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"
++++++++++++
###############
- 搜索含有thanks的行。
[root@localhost ~]# grep "thanks" mytest.txt
I'm fine,thanks
- 搜索以Good开头的行
[root@localhost ~]# grep "^Good" mytest.txt
Good afternoon everyone
- 搜索一个包含od的行,d字母可有可无,不限次数。
[root@localhost ~]# grep "od*" mytest.txt
- 搜索一个词,该词以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