linux正则表达式

正则表达式:

  就是一套处理字符串的规则和方法,以为单位对字符串进行处理,通过特殊的符号的辅助,我们可以快速的过滤、替换某些特定的字符串。

  运维工作中,会有大量的访问日志、错误日志、大数据、如何能够快速的过滤出我们需要的内容,就需要正则表达式。

  awk,sed,grep(egrep) 三剑客要想能够工作的更高效,那一定离不开正则表达式的配合。

  Linux文本处理三剑客:

  grep: 文本过滤工具;grep擅长查找功能

  sed:文本编辑器(行);stream editor; sed擅长取行和替换

  awk:文本报告生成器;Linux上awk的实现为gawkawk擅长取列

     linux里的正则表达式主要是awk,sed,grep(egrep)三剑客的正则表达式。

基础正则表达式:BRE basical regular expression

  正则表达式实际就是一些特殊字符,赋予了它特定的含义://注意:和shell命令稍有不同!

(1)、^word 搜索以word开头的 //^a 表示搜索以a开头的内容

(2)、word$ 搜索以word结尾的 //a$ 表示搜索以a结尾的内容;^$ 表示空行,不是空格

(3)、.代表且只能代表任意一个字符

(4)、\ 转义字符,让有着特殊身份意义的字符脱掉马甲,打回原形 //  \.

(5)、* 重复0个或者多个前面的一个字符

(6)、.* 匹配所有字符  

    //^.* 以任意多个字符开头( ^.* 根据前面的单个字符,我们知道^.*匹配以任意多个字符串开头的内容。); .*$以任意多个字符结尾

(7)、[word]  匹配字符集合内的任意一个字符    //[abc]、[a-z]

(8)、[^word] 匹配不包含^后的任意字符的内容    //[^abc] 匹配不包含^后的任意字符的内容

        [^a-z] 不包含小写字母

        [^0-9] 不包含数字

 (9)、a\{n,m\} 重复n到m次,前一个重复的字符  //如果用egrep可以去掉斜线\

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

   // a\{,m\} 重复至多m次,前一个重复的字符      //如果用egrep可以去掉斜线\

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

 

扩展正则表达式:

(1)、+ 重复一个或者一个以上的前面的字符

(2)、? 重复0个或者一个0前面的字符

(3)、| 用或 的方式查找多个符合的字符串

(4)、() 找出“用户组”字符串

实验的3个注意事项:
a.linux正则一般以行为单位处理的。
b.alias grep='grep --color=auto'
c.注意字符集,LC_ALL=C,不是必须

grep一般常用参数:

grep [OPTIONS] PATTERN [FILE...]:

选项:

-a: 在二进制文件中,以文本文件的方式搜索数据
-c: 计算找到‘搜索字符串’的次数
-o: 仅显示出匹配regexp的内容(用于统计出现在文中的次数)
-i: 忽略大小写的不同,所以大小写视为相同
-n: 在行首显示行号
-v: 反向选择,即显示没有‘搜索字符串’内容的那一行
-E: 扩展的grep,即egrep
--color=auto: 以特定颜色高亮显示匹配关键字
#<-提示:-i -v 为常用参数
-A: After的意思,显示匹配字符串后n行的数据
-B: before的意思,显示匹配字符串前n行的数据

[root@bogon ~]# man grep

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

基础正则表达式举例:

[root@bogon ~]# cat oldboy.log
I am oldboy linux teacher.
I like chinese chess,table tennis.
My blog is http://oldboy.blog.51cto.com
My qq is 49000448
my god,my name is not oldboy,but OLDBOY.

[root@bogon ~]# grep "^I" oldboy.log
I am oldboy linux teacher.
I like chinese chess,table tennis.
[root@bogon ~]# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@bogon ~]# alias grep='grep --color=auto'
[root@bogon ~]# grep "^I" oldboy.log
I am oldboy linux teacher.
I like chinese chess,table tennis.

 

[root@bogon ~]# grep "^M" oldboy.log   //以M开头的
My blog is http://oldboy.blog.51cto.com
My qq is 49000448
[root@bogon ~]# grep -i "^M" oldboy.log   //-i 不区分大小写
My blog is http://oldboy.blog.51cto.com
My qq is 49000448
my god,my name is not oldboy,but OLDBOY.

 

[root@bogon ~]# grep -i "m$" oldboy.log //以m结尾的
My blog is http://oldboy.blog.51cto.com

 

[root@localhost ~]# grep -n "^$" oldboy.log
[root@localhost ~]# grep -vn "^$" oldboy.log
1:I am oldboy linux teacher.
2:I like chinese chess,table tennis.
3:My blog is http://oldboy.blog.51cto.com
4:My qq is 49000448
5:my god,my name is not oldboy,but OLDBOY.
6:not boog
7:4900000448,49448

 

[root@bogon ~]# grep "bl.g" oldboy.log  //.代表且只能代表任意一个字符
My blog is http://oldboy.blog.51cto.com

[root@bogon ~]# echo "not boog" >> oldboy.log
[root@bogon ~]# grep "b.og" oldboy.log
My blog is http://oldboy.blog.51cto.com
not boog

 

[root@bogon ~]# grep -n "." oldboy.log   //.表任意字符,故全部出现了    -n标记行号
1:I am oldboy linux teacher.
2:I like chinese chess,table tennis.
3:My blog is http://oldboy.blog.51cto.com
4:My qq is 49000448
5:my god,my name is not oldboy,but OLDBOY.
7:not boog

 

[root@bogon ~]# grep -n "\." oldboy.log   //包含.的匹配行显示
1:I am oldboy linux teacher.
2:I like chinese chess,table tennis.
3:My blog is http://oldboy.blog.51cto.com
5:my god,my name is not oldboy,but OLDBOY.

 

[root@bogon ~]# grep "490*448" oldboy.log // 匹配0个或者多个0的行
My qq is 49000448
[root@bogon ~]# echo "4900000448,49448" >> oldboy.log
[root@bogon ~]# grep "490*448" oldboy.log
My qq is 49000448
4900000448,49448

[root@bogon ~]# grep "490.*448" oldboy.log  // 匹配任意字符0个或者多个的行
My qq is 49000448
4900000448,49448
[root@bogon ~]# grep ".*" oldboy.log   // .*匹配所有字符的行
I am oldboy linux teacher.
I like chinese chess,table tennis.
My blog is http://oldboy.blog.51cto.com
My qq is 49000448
my god,my name is not oldboy,but OLDBOY.

not boog
4900000448,49448

 

[root@bogon ~]# grep "b[lo]og" oldboy.log   //匹配l 或者o 字符
My blog is http://oldboy.blog.51cto.com
not boog

 

[root@bogon ~]# grep "[oldboy]" oldboy.log
I am oldboy linux teacher.
I like chinese chess,table tennis.
My blog is http://oldboy.blog.51cto.com
My qq is 49000448
my god,my name is not oldboy,but OLDBOY.
not boog
[root@bogon ~]# grep "[^oldboy]" oldboy.log
I am oldboy linux teacher.
I like chinese chess,table tennis.
My blog is http://oldboy.blog.51cto.com
My qq is 49000448
my god,my name is not oldboy,but OLDBOY.
not boog
4900000448,49448
[root@bogon ~]# grep "[^0-9]" oldboy.log
I am oldboy linux teacher.
I like chinese chess,table tennis.
My blog is http://oldboy.blog.51cto.com
My qq is 49000448
my god,my name is not oldboy,but OLDBOY.
not boog
4900000448,49448

 

[root@bogon ~]# grep "490\{2,3\}448" oldboy.log
My qq is 49000448
[root@bogon ~]# grep "490\{2,10\}448" oldboy.log
My qq is 49000448
4900000448,49448
[root@bogon ~]# grep "490\{,5\}448" oldboy.log
grep: 重复次数定义地不完整
[root@bogon ~]# grep "490\{2,\}448" oldboy.log
My qq is 49000448
4900000448,49448
[root@bogon ~]# grep "490\{2\}448" oldboy.log
[root@bogon ~]# grep "490\{3\}448" oldboy.log
My qq is 49000448
[root@bogon ~]# grep "490\{0\}448" oldboy.log
4900000448,49448
[root@bogon ~]# grep "490\{5\}448" oldboy.log
4900000448,49448

 

扩展正则表达式举例

grep "490+448" oldboy.log
[root@bogon ~]# egrep "490+448" oldboy.log //重复一个或者一个以上的前面的字符
My qq is 49000448
4900000448,49448
[root@bogon ~]# grep -E "490+448" oldboy.log
My qq is 49000448
4900000448,49448

 

[root@bogon ~]# grep -E "490?448" oldboy.log //重复0个或者一个0前面的字符
4900000448,49448

 

[root@bogon ~]# grep -E "3306 | 1521" /etc/services  //用或 的方式查找多个符合的字符串
ncube-lm 1521/tcp # nCube License Manager
ncube-lm 1521/udp # nCube License Manager

 

[root@bogon ~]# grep -E "b(lo|oo)g" oldboy.log  //找出“用户组”字符串
My blog is http://oldboy.blog.51cto.com
not boog

 

posted @ 2017-07-18 22:01  bkycrmn  阅读(132)  评论(0)    收藏  举报