linux正则表达式

一、linux正则表达式的概念。

1、什么是正则表达式?

简单地说,正则表达式就是为处理大量的字符串而定义的一套规则和方法,例如:假设“#”代表 oldboy,“%”代表oldgirl。echo “#%”==”oldboyoldgirl”通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。linux正则表达式一般以行尾单位处理的。

 

2、为什么要学会正则表达式?

在企业工作中,我们每天做的linux运维工作中,时刻都会面对大量带有字符串的文本配置、程序、命令输出及日志文件等,而我们经常会有迫切的需要,从大量的字符串内容中查找符合工作需要的特定的字符串。这就要靠正则表达式。因此,可以说正则表达式就是过滤这样字符串的需求而生的!

 

3、容易混淆的两个注意事项:

 

3.1、正则表达式应用非常广泛,存在于各种语言中,例如:php,python,java等。但是,我们linux系统运维工作中的正则表达式,最常应用正则表达式的命令就是grep(egrep),sed,awk,换句话说linux三剑客要想能工作的更高效,那一定离不开正则表达式的配合。

 

3.2、正则表达式和我们常用的通配符特殊字符是有本质区别的,这一点要注意。通配符例子:ls *.log 这里的*就是通配符(表示所有),不是正则表达式。

 

二、基础正则字符说明:

1、^word 匹配以word开头的内容。 vi/vim 编辑器里 ^代表一行的开头。

例子:

[root@oldboy test]# grep "^m" oldboy.log 

my blog is http://oldboy.blog.51cto.com
my qq num is 49000448.
my god ,i am not oldbey,but OLDBOY!

 

2、word$ 匹配以word结尾的内容。 vi/vim 编辑器里 $代表一行的结尾。

例子:

[root@oldboy test]# grep "m$" oldboy.log  
my blog is 
http://oldboy.blog.51cto.com

 

3、^$     表示空行。

例子:

[root@oldboy test]# grep -n "^$" oldboy.log 
3:
8:

4、.      代表且只能代表任意一个字符。

例子:

[root@oldboy test]# grep -n "." oldboy.log    
1:I am oldboy teacher!
2:I teach linux.
4:I like badminton ball ,billiard ball and chinese chess!
5:my blog is 
http://oldboy.blog.51cto.com
6:our site is 
http://www.etiantian.org
7:my qq num is 49000448.
9:not 4900000448.
10:my god ,i am not oldbey,but OLDBOY!

 

5、\      专义字符,例\.就只代表点本身,让特殊身份意义的字符脱掉马甲,还原原型。

例子:

[root@oldboy test]# grep -n "\.$" oldboy.log 
2:I teach linux.
7:my qq num is 49000448.
9:not 4900000448.

 

6、*    重复0个或多个前面的一个字符,例o*匹配没有o,有1个o或多个oooo 。

例子:

[root@oldboy test]# egrep "go*d" oldboy.log 
my god ,i am not oldbey,but OLDBOY!
gd
good

 

7、.*    匹配所有的字符。延伸^.* 以任意多个字符开头。.*$以任意多个字符结尾。

例子:

[root@oldboy test]# grep -n ".*" oldboy.log 
1:I am oldboy teacher!
2:I teach linux.
3:
4:I like badminton ball ,billiard ball and chinese chess!
5:my blog is 
http://oldboy.blog.51cto.com
6:our site is 
http://www.etiantian.org
7:my qq num is 49000448.
8:
9:not 4900000448.

 

8、[abc]   匹配字符集合内的任意一个字符[a-z A-Z],[0-9]。

例子:

[root@oldboy oldboy]# grep "[0-9]" oldboy.log     

my blog is http://oldboy.blog.51cto.com

my qq num is 49000448.

not 4900000448.

 

9、[^abc]  匹配不包含^后的任意一个字符串的内容。中括号里的^为取反,注意和中括号外面以…开头区别。

例子:

[root@oldboy oldboy]# grep "[^abc]" oldboy.log

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our site is http://www.etiantian.org

my qq num is 49000448.

not 4900000448.

my god ,i am not oldboy,but OLDBOY!

good

goood

gd

 

10、a\{n,m\}  重复n到m次,前一个重复的字符。如果用egrep/sed-r可以去掉斜线。

例子:

[root@oldboy oldboy]# grep "0\{3,4\}" oldboy.log 

my qq num is 49000448.

not 4900000448.

 

11、a\{n,\}  重复至少n次,前一个重复的字符。如果用egrep/sed -r可以去掉斜线。

例子:

[root@oldboy oldboy]# grep "0\{3,\}" oldboy.log 

my qq num is 49000448.

not 4900000448.

 

12、a\{n\}  重复n次,前一个重复的字符。如果用egrep/sed -r可以去掉斜线。

例子:

[root@oldboy oldboy]# grep "0\{3\}" oldboy.log      

my qq num is 49000448.

not 4900000448.

 

13、a\{,m\}  ?????CentOS5不能用,CentOS6可以了

例子:

[root@oldboy oldboy]# grep "0\{3\}" oldboy.log      

my qq num is 49000448.

not 4900000448.

 

 

提示:点(.)的特殊含义小结;

      1、当前目录

      2、使得文件生效相当于source

      3、隐藏文件

      4、任意一个字符(grep正则)

 

注意:egrep(grep -E)或sed -r过滤一般特殊字符可以不转义(不用\)。

 

14、grep 参数小结:

 -a:在二进制文件中,以文本文件的方式搜索数据

 -c : 计算找到‘搜索字符串’的次数

 -o:仅显示出匹配regexp的内容(用于统计出现在文件的次数)

 -i *****:忽略大小写的不同,所以大小写视为相同*****

 -n*****:匹配的内容再其行首显示行号*****

 -v*****:反向选择,及显示没有‘搜索字符串’内容的那一行*****

 -E*****:扩展的grep,即egrep*****

 --color=auto:以特定颜色高亮显示匹配关键字***

#提示: -i  -v 为常用参数 。

 -A :After的意思,显示匹配字符串及其后n行是数据

 -B :before 的意思,显示匹配字符串及其前的n行的数据

 -C :context 的意思,显示匹配字符串及前后各num行

 

三、扩展的正则表达式(ERE):

扩展的正则表达式使用的命令为: grep -E以及egrep 【了解即可】

 

1、+ 表示重复 “一个或一个以上”前面的字符(*是0或多个)

例子:

[root@oldboy test]# egrep "go+d" oldboy.log
my god ,i am not oldbey,but OLDBOY!
good

 

2、?表示重复 “0个或一个”前面的字符

例子:

[root@oldboy oldboy]# egrep "go?d" oldboy.log

my god ,i am not oldboy,but OLDBOY!

gd

 

3、| 表示同时过滤多个字符串

例子:

[root@oldboy oldboy]# egrep "good|not" oldboy.log 

not 4900000448.

my god ,i am not oldboy,but OLDBOY!

good

 

4、() 分组过滤,后向引用

例子:

[root@oldboy oldboy]# egrep "(good)" oldboy.log   

good