一、正则表达式
1、正则表达式简介
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:RegularExpression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。――维基百科
正则表达式是计算机智能的一种体现,她能让我们在繁杂的计算机文本之中找到我们最想要的东西,在她那规则而又朦胧的面纱之下是一张优雅而又调皮的面孔,对于初入Linux大门的男人来说,无不拜倒在她的石榴裙下,而本文所要做的就是如何俘获她的芳心。
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命令
1、简介
grep:默认支持基本正则表达式;
egrep:扩展正则表达式;
fgrep:不支持正则表达式元字符,搜索字符串的速度快,等同於grep-F
2、常用选项
语法:grep[-cinvABC]'word'filename
-c:打印符合要求的行数
-v:打印不符合要求的行
-A:后跟一个数字(有无空格都可以),例如�A2则表示打印符合要求的行以及下面两行
-B:后跟一个数字,例如�B2则表示打印符合要求的行以及上面两行
-C:后跟一个数字,例如�C2则表示打印符合要求的行以及上下各两行
-r:会把目录下面所有的文件全部遍历
-o只显示被模式匹配到的字串,而不是整个行。
-i忽略大小写
在使用grep命令时可以做一个别名aliasgrep="grep--color"写入到.bashrc里面,今后在使用grep命令查找关键字就会显示颜色了。
3、应用举例
过滤以root开头和以nologin结尾的行并显示行号
[root@hpf-linux222]#grep-n'^root'passwd 1:rootmail:x:0:0:root:/root:/bin/bash [root@hpf-linux222]#grep-n'nologin$'passwd 2:bin:x:1:1:bin:/bin:/sbin/nologin 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin .............
忽略大小写字符的查找
[root@hpf-linux222]#grep-in'root'passwd 1:rootmail:x:0:0:root:/root:/bin/bash 2:root:x:0:0:root:/root:/bin/bash 3:bin:x:1:ROOT1:bin:/bin:/sbin/nologin 12:operator:x:11:0:operator:/root:/sbin/nologin
查找以XXX开头或者以XXX结尾的行
[root@hpf-linux222]#grep'\<root'passwd rootmail:x:0:0:root:/root:/bin/bash root:x:0:0:root:/ftproot:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@hpf-linux222]#grep'root\>'passwd rootmail:x:0:0:root:/root:/bin/bash root:x:0:0:root:/ftproot:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
grep'^[^a-zA-Z]'与grep-v'^[a-zA-Z]'俩的区别
[root@hpf-linux222]#grep'^[^a-zA-Z]'/etc/crontab #Fordetailsseeman4crontabs #Exampleofjobdefinition: #.----------------minute(0-59) #|.-------------hour(0-23) #||.----------dayofmonth(1-31) #|||.-------month(1-12)ORjan,feb,mar,apr... #||||.----dayofweek(0-6)(Sunday=0or7)ORsun,mon,tue,wed,thu,fri,sat #||||| #*****user-namecommandtobeexecuted [root@hpf-linux222]#grep-v'^[a-zA-Z]'!$ grep-v'^[a-zA-Z]'/etc/crontab #Fordetailsseeman4crontabs #Exampleofjobdefinition: #.----------------minute(0-59) #|.-------------hour(0-23) #||.----------dayofmonth(1-31) #|||.-------month(1-12)ORjan,sat #||||| #*****user-namecommandtobeexecuted
从以上例子中可以得出结论:带-v的选项可以过滤出空格行而不带则不能过滤;
使用-A-B-C选项举例
[root@hpf-linux222]#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-linux222]#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-linux222]#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
[root@hpf-linux222]#cattest.txt 32534 34575 @fhfhhj ^&^%#% h45654 3221jty
[0-9]只要该行有数字均会显示出
[root@hpf-linux222]#grep'[0-9]'test.txt 32534 34575 h45654 3221jty
^[0-9]只会显示以数字开头的行
[root@hpf-linux222]#grep'^[0-9]'test.txt 32534 34575 3221jty
[^0-9]只要该行没有数字均会显示出
[root@hpf-linux222]#grep'[^0-9]'test.txt 34575 @fhfhhj ^&^%#% h45654 3221jty
^[^0-9]只会显示以非数字开头的行
[root@hpf-linux222]#grep'^[^0-9]'test.txt @fhfhhj ^&^%#% h45654
[a-z]、^[a-z]、[^a-z]、^[^a-z]、[A-Z]、^[A-Z]、[^A-Z]、^[^A-Z]
这些选项与数字大概意思差不多,今后只要记住
[-]只要该行有中括号范围内内容均会显示,^[-]显示以中括号范围内内容开头的行
[^-]只要该行没有中括号范围内内容均会显示,^[^-]显示以中括号范围内内容以外开头的行
关于-o选项与-c选项的使用与区别
-o只显示被模式匹配到的字串,而不是整个行。
-c打印符合要求的行数
从字义上可以理解为:-o为找出匹配字符串的个数通常可以与wc-l一块使用而可以找出该文件一共有多少个关键字,而-c则是打印出有总共有多少行包含关键字,从而可以说明-o的输出数据会大于等于-c输出的数据,因为一行可以有一个或者多个关键字,请看例子:
[root@hpf-linux222]#grep-c'root'passwd 2 [root@hpf-linux222]#grep-o'root'passwd root root root root [root@hpf-linux222]#grep-o'root'passwd|wc-l 4 [root@hpf-linux222]#grep'root'passwd rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
关于.、*、.*的使用:
.是表示任意一个字符
[root@hpf-linux222]#grep'r..t'passwd rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin
*是表示0个或者多个*前面的字符
[root@hpf-linux222]#grep'ro*t'passwd rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin vcsa:x:69:69:virtualconro,tsolememoryowner:/dev:/sbin/nologin roooooooooooooot roooot
.*是贪婪匹配可以表示任意个任意字符
[root@hpf-linux222]#grep'r.*t'passwd rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin vcsa:x:69:69:virtualconro,tsolememoryowner:/dev:/sbin/nologin
由于有些字符选项(+、{、}、?、|等)grep不支持只能用脱意字符\或者在grep后面加-E选项才能使用,如果不想用上两种方法这可以用egrep命令来替代同时egrep命令也支持带颜色显示;
+选择一个或者一个以上前面的内容
[root@hpf-linux222]#egrep'ro+t'passwd rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin rooooot rot
?零个或者一个前面的内容
[root@hpf-linux222]#egrep'ro?t'passwd vcsa:x:69:69:virtualconro,tsolememoryowner:/dev:/sbin/nologin rot
|或者的一时可以显示两边任意一个字符,为避免发生歧义一定要使用()将所需选择的内容括起来
[root@hpf-linux222]#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:virtualconro,tsolememoryowner:/dev:/sbin/nologin saslauth:x:499:76:Sarotslauthduser:/var/empty/saslauth:/sbin/nologin postfix:x:89:89:roat:/var/spool/postfix:/sbin/nologin [root@hpf-linux222]#egrep'r(o|a)t'passwd--color operator:x:11:0:operator:/root:/sbin/nologin sshd:x:74:74:Privilege-separatedSSH:/var/empty/sshd:/sbin/nologin rot
{n}该选项会匹配中括号前面的字符出现n次
[root@hpf-linux222]#egrep'ro{1}t'passwd rot [root@hpf-linux222]#egrep'ro{2}t'passwd rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@hpf-linux222]#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-linux222]#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