正则表达式及grep的使用

前端之家收集整理的这篇文章主要介绍了正则表达式及grep的使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、正则表达式

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:打印符合要求的行数

-n:在输出符合要求的行的同时连同行号一起输出

-v:打印不符合要求的行

-A:后跟一个数字(有无空格都可以),例如�A2则表示打印符合要求的行以及下面两行

-B:后跟一个数字,例如�B2则表示打印符合要求的行以及上面两行

-C:后跟一个数字,例如�C2则表示打印符合要求的行以及上下各两行

-r:会把目录下面所有的文件全部遍历

--color:可以将过滤输出目标的添加颜色

-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

猜你在找的正则表达式相关文章