码迷,mamicode.com
首页 > 其他好文 > 详细

正则表达式及grep的使用

时间:2015-04-13 07:03:02      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:正则 grep

一、正则表达式     
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。——维基百科 
   正则表达式是计算机智能的一种体现,她能让我们在繁杂的计算机文本之中找到我们最想要的东西,在她那规则而又朦胧的面纱之下是一张优雅而又调皮的面孔,对于初入Linux大门的男人来说,无不拜倒在她的石榴裙下,而本文所要做的就是如何俘获她的芳心。
1、了解她的身世
  在1956 年,美国的一位名叫Stephen Kleene的数学科学家,他在Warren McCulloch和Walter Pitts早期工作的基础之上,发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的
概念。正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。之后一段时间,人们发现可以将这一工作成果应用于其他方面。Ken Thompson就把这一成果应用于计算搜索算法的一些早期研究,Ken Thompson是 Unix的主要发明人,也就是大名鼎鼎的Unix之父。Unix之父将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。近二十年来,在WINDOW的阵营下,正则表达式的思想和应用在大部分 Windows 开发者工具包中得到支持和嵌入应用!目前主流的开发语言(PHP、C#、Java、C++、VB、Javascript、Ruby以及python等)、数以亿万计的各种应用软件中,都可以看到正则表达式优美的舞姿。
2、经常使用的正则表达式元字符
       *    0个或多个在*字符之前的那个普通字符
       .    匹配任意一个字符
       .*   贪婪匹配
       ^    匹配行首
       $    匹配行尾
      ^$    匹配空白行    
      []    匹配指定范围内的任意单个字符          
      [^]   匹配指定范围外的任意单个字符  
        \   转义符,屏蔽一个元字符的特殊意义 
      <\>   精确匹配符号
      \{n\}   匹配前面字符出现n次
      \{n,\}  匹配前面字符至少出现n次
      \{n,m\} 匹配前面字符出现n~m次
        ?     匹配0个或一个在其之前的那个普通字符             
        +     匹配一个或多个在其之前的那个普通字符 
        ()    表示一个字符集合或用在expr中        
        |     表示“或”匹配一组可选的字符             
      [0-9]   [[:digit:]] 
      [^0-9]  [^[:digit:]] 
      [a-z]   [[:lower:]] 
      [A-Z]   [[:upper:]] 
  空格或者tab键   [[:space:]]       
  [0-9a-zA-Z] [[:alnum:]]
    [a-zA-Z]  [[:alpha:]]      

 二、关于grep 命令 
grep: 默认支持基本正则表达式;
egrep: 扩展正则表达式;
fgrep: 不支持正则表达式元字符,搜索字符串的速度快,等同於grep -F
   
语法: grep  [-cinvABC]  ‘word‘  filename 
-c :打印符合要求的行数
-n :在输出符合要求的行的同时连同行号一起输出 
-v :打印不符合要求的行 
-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行 
-B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行  
-C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行 
-r : 会把目录下面所有的文件全部遍历
--color:可以将过滤输出目标的添加颜色 
-o   只显示被模式匹配到的字串,而不是整个行。 

在使用grep 命令时可以做一个别名alias grep="grep --color" 写入到.bashrc里面,今后在使用grep命令查找关键字就会显示颜色了。

1.过滤以root开头和以nologin结尾的行并显示行号  

[root@hpf-linux 222]# grep -n ‘^root‘ passwd 

1:rootmail:x:0:0:root:/root:/bin/bash

[root@hpf-linux 222]#  grep -n ‘nologin$‘ passwd 

2:bin:x:1:1:bin:/bin:/sbin/nologin

3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
.............  

 2.grep ‘^[^a-zA-Z]‘与 grep -v ‘^[a-zA-Z]‘俩的区别
[root@hpf-linux 222]# grep ‘^[^a-zA-Z]‘ /etc/crontab 
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
[root@hpf-linux 222]# grep -v ‘^[a-zA-Z]‘ !$
grep -v ‘^[a-zA-Z]‘ /etc/crontab
 
# For details see man 4 crontabs
 
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

从以上例子中可以得出结论:带-v的选项可以过滤出空格行而不带则不能过滤;

3.使用-A -B -C选项举例
[root@hpf-linux 222]# grep -A2 ‘sync‘ passwd 

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

[root@hpf-linux 222]# grep -B2 ‘sync‘ passwd 

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

[root@hpf-linux 222]# grep -C2 ‘sync‘ passwd 

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt 

 
4.打印数字或字母开头,以及不是字母和数字开头的文件内容

[root@hpf-linux 222]# cat test.txt 

32534

34 575

@fhfhhj

^&^%#%

h45654

3221jty

[0-9] 只要该行有数字均会显示出
[root@hpf-linux 222]# grep ‘[0-9]‘ test.txt 

32534

34 575

h45654

3221jty

^[0-9] 只会显示以数字开头的行
[root@hpf-linux 222]# grep ‘^[0-9]‘ test.txt 

32534

34 575

3221jty 
 
[^0-9] 只要该行没有数字均会显示出
 [root@hpf-linux 222]# grep ‘[^0-9]‘ test.txt 

34 575

@fhfhhj

^&^%#%

h45654

3221jty

^[^0-9] 只会显示以非数字开头的行   
[root@hpf-linux 222]# grep ‘^[^0-9]‘ test.txt 

@fhfhhj

^&^%#%

h45654 

 
[a-z]、^[a-z]、[^a-z]、^[^a-z]、[A-Z]、^[A-Z]、[^A-Z]、^[^A-Z]
这些选项与数字大概意思差不多,今后只要记住
[ - ] 只要该行有中括号范围内内容均会显示,^[ - ]显示以中括号范围内内容开头的行   
[^ - ]只要该行没有中括号范围内内容均会显示,^[^ - ]显示以中括号范围内内容以外开头的行      

5.关于-o选项与-c选项的使用与区别

-o   只显示被模式匹配到的字串,而不是整个行。 

-c   打印符合要求的行数

从字义上可以理解为:-o为找出匹配字符串的个数通常可以与wc -l一块使用而可以找出该文件一共有多少个关键字,而-c则是打印出有总共有多少行包含关键字,从而可以说明-o 的输出数据会大于等于-c输出的数据,因为一行可以有一个或者多个关键字,请看例子:
 
[root@hpf-linux 222]# grep -c  ‘root‘ passwd 

2

[root@hpf-linux 222]# grep -o  ‘root‘ passwd 

root

root

root

root

[root@hpf-linux 222]# grep -o  ‘root‘ passwd |wc -l

4

[root@hpf-linux 222]# grep   ‘root‘ passwd 

rootmail:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin


6.关于.、*、.*的使用

.是表示任意一个字符
[root@hpf-linux 222]# grep ‘r..t‘ passwd 

rootmail:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin            
 *是表示0个或者多个*前面的字符           

[root@hpf-linux 222]# grep ‘ro*t‘ passwd 

rootmail:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

vcsa:x:69:69:virtual conro,tsole memory owner:/dev:/sbin/nologin

roooooooooooooot

roooot
.*是贪婪匹配可以表示任意个任意字符              

[root@hpf-linux 222]# grep ‘r.*t‘ passwd 

rootmail:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

vcsa:x:69:69:virtual conro,tsole memory owner:/dev:/sbin/nologin

7.由于有些字符选项(+、{、}、?、|等)grep不支持只能用脱意字符\或者在grep后面加-E选项才能使用,如果不想用上两种方法这可以用egrep命令来替代同时egrep命令也支持带颜色显示;

+ 选择一个或者一个以上前面的内容

[root@hpf-linux 222]# egrep ‘ro+t‘ passwd 

rootmail:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

rooooot

rot

? 零个或者一个前面的内容 
[root@hpf-linux 222]# egrep ‘ro?t‘ passwd 
 
vcsa:x:69:69:virtual conro,tsole memory owner:/dev:/sbin/nologin

rot  
| 或者的一时可以显示两边任意一个字符,为避免发生歧义一定要使用()将所需选择的内容括起来

[root@hpf-linux 222]# egrep ‘ro|at‘ passwd --color

rootmail:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

vcsa:x:69:69:virtual conro,tsole memory owner:/dev:/sbin/nologin

saslauth:x:499:76:Saro tslauthd user:/var/empty/saslauth:/sbin/nologin

postfix:x:89:89:roat:/var/spool/postfix:/sbin/nologin

[root@hpf-linux 222]# egrep ‘r(o|a)t‘ passwd --color

operator:x:11:0:operator:/root:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

rot

{n} 该选项会匹配中括号前面的字符出现n次
[root@hpf-linux 222]# egrep ‘ro{1}t‘ passwd 

rot

[root@hpf-linux 222]# egrep ‘ro{2}t‘ passwd 

rootmail:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

[root@hpf-linux 222]# egrep ‘ro{1,2}t‘ passwd 

rootmail:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

rot 
[root@hpf-linux 222]# egrep ‘ro{2,}t‘ passwd 

rootmail:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

roooooooooooooot



                      
参考文档:
http://linuxlover.blog.51cto.com/2470728/1629038

正则表达式及grep的使用

标签:正则 grep

原文地址:http://9950284.blog.51cto.com/9940284/1631647

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!