正则表达式:

by www.linuxfan.cn 2016.1.23

正则表达式是基于样式匹配的文本处理技术的关键所在。

1.正则表达式的基本组成部分:

^ :行起始标记

$ :行尾标记

. :匹配任意一个(单个)字符

[] :匹配包含在[字符]之中的任意一个字符

[^] :匹配除[^字符]之外的任意一个字符

[-] :匹配中指定范围内的任意一个字符

? :匹配之前的项1或0次

+ :匹配之前的项1次或多次

* :匹配之前的项0或多次

() :创建一个用于匹配的字串

{n} :匹配之前的项n次

{n,} :之前的项至少需要匹配n次

{n,m} :指定之前的项所必需匹配

| :交替匹配|两边的任意一项

\ :转义字符可以将上面的特殊字符进行转义

案例:

^linux ##以linux开始

补充知识:正则表达式及grep_第1张图片

linux$ ##以linux结束

补充知识:正则表达式及grep_第2张图片

linuxfan. ##匹配linuxfans等

补充知识:正则表达式及grep_第3张图片

coo[kl] ##匹配cool或cook

补充知识:正则表达式及grep_第4张图片

9[^5689] ##匹配91,92等,但不匹配95,98等

补充知识:正则表达式及grep_第5张图片

[0-9] ##匹配任意一个所有的数字

补充知识:正则表达式及grep_第6张图片

[a-z]|[A-Z] ##匹配任意一个所有大小写字母,|属于扩展正则grep -E支持

补充知识:正则表达式及grep_第7张图片

colou?r ##匹配color或clolur,但是不能匹配colouur

补充知识:正则表达式及grep_第8张图片

rollno-9+ ##匹配rollno-9、rollno-99,rollno-999,但不匹配rollno-

补充知识:正则表达式及grep_第9张图片

co*l ##匹配cl,col,cool,coool等

补充知识:正则表达式及grep_第10张图片

ma(tri)x ##匹配max或matrix

补充知识:正则表达式及grep_第11张图片

[0-9]{3} ##匹配任意一个三位数,等于[0-9][0-9][0-9]

补充知识:正则表达式及grep_第12张图片

[0-9]{2,} ##匹配任意一个两位数或更多位的数字

补充知识:正则表达式及grep_第13张图片

[0-9]{2,5} ##匹配从两位数到五位数之间的任意一个数字

补充知识:正则表达式及grep_第14张图片

Oct (1st | 2nd) ##匹配Oct 1st或Oct 2nd

补充知识:正则表达式及grep_第15张图片

a\.b ##匹配a.b,但不能匹配ajb

补充知识:正则表达式及grep_第16张图片

[a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4} ##匹配一个邮箱地址

补充知识:正则表达式及grep_第17张图片

[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ##匹配IP地址

补充知识:正则表达式及grep_第18张图片

2.grep用法:

[root@ns ~]# cat /proc/meminfo |grep -e Mem -e Cache -e Swap ##查看系统内存、缓存、交换分区-e的作用是匹配多个表达式

补充知识:正则表达式及grep_第19张图片

[root@ns ~]# grep -R -o -n -E '[a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4}' /etc/ ##查找/etc目录下的所有文件中的邮件地址;-R递归,-n表示匹配的行号,-o只输出匹配内容,-E支持扩展正则表达式,

补充知识:正则表达式及grep_第20张图片

[root@ns ~]# grep -R -c 'HOSTNAME' /etc/ |grep -v "0$" ##查找/etc/目录下文件中包含“HOSTNAME”的次数,-c统计匹配次数,-v取反

补充知识:正则表达式及grep_第21张图片

[root@ns ~]# grep -R -l 'HOSTNAME' /etc/ ##查找包含“HOSTNAME”的文件名,-l显示匹配的文件名,-L显示不匹配的文件名

补充知识:正则表达式及grep_第22张图片

[root@ns ~]# dmesg | grep -n --color=auto 'eth' ##查找内核日志中eth的行,显示颜色及行号

补充知识:正则表达式及grep_第23张图片

[root@ns ~]# dmesg | grep -n -A3 -B2 --color=auto 'eth' ##用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,在关键字所在行的前两行与后三行也一起找出出来显示

补充知识:正则表达式及grep_第24张图片

[root@ns ~]# cat /etc/passwd |grep -c bash$ ##统计系统中能登录的用户的个数

补充知识:正则表达式及grep_第25张图片

[root@ns tmp]# touch /tmp/{123,123123,456,1234567}.txt ##创建测试文件,以下三条命令是一样的效果,匹配文件名123,可以包含1个到多个

补充知识:正则表达式及grep_第26张图片

[root@ns tmp]# ls |grep -E '(123)+'

补充知识:正则表达式及grep_第27张图片

[root@ns tmp]# ls |grep '\(123\)\+'

补充知识:正则表达式及grep_第28张图片

[root@ns tmp]# ls |grep -E '(123)+'

补充知识:正则表达式及grep_第29张图片

[root@ns ~]# ps -ef |grep -c httpd ##统计httpd进程数量

补充知识:正则表达式及grep_第30张图片

[root@ns ~]# grep -C 4 'games' --color /etc/passwd ##显示games匹配的“-C”前后4行

补充知识:正则表达式及grep_第31张图片

[root@ns ~]# grep ^adm /etc/group ##查看adm组的信息

补充知识:正则表达式及grep_第32张图片

[root@ns ~]# ip a |grep -E '^[0-9]' |awk -F : '{print $2}' ##获取网卡名称

补充知识:正则表达式及grep_第33张图片

[root@ns ~]# ifconfig eth0 |grep -E -o 'inet addr:[^ ]*' |grep -o '[0-9.]*' ##截取ip地址,[^ ]*表示以非空字符作为结束符,[0-9.]*表示数字和点的组合

补充知识:正则表达式及grep_第34张图片

[root@ns ~]# ifconfig eth0 |grep -i hwaddr |awk '{print $5}' ##截取MAC地址

补充知识:正则表达式及grep_第35张图片

测试文档:使用grep -E命令练习正则表达式

[root@ns tmp]# cat test.txt

ABcd

10.10.10.10

color

colur

linuxfan2

colouur

rollno-9

i like linux

linux funny.

I am linuxfan.

rollno-99

rollno-999

cl

col

cool

coool

cook

max

matrix

192.168.100.100

123456789

123123123

123123

23346123

123

12

12345

94

95

96

97

98

99

100

Oct 1st

Oct 2nd

a.b

ajb

abc

[email protected]

linux

[root@ns tmp]#