正则表达式:
正则表达式是基于样式匹配的文本处理技术的关键所在。
正则表达式的基本组成部分:
^ :行起始标记
$ :行尾标记
. :匹配任意一个(单个)字符
[] :匹配包含在[字符]之中的任意一个字符
[^] :匹配除[^字符]之外的任意一个字符
[-] :匹配中指定范围内的任意一个字符
? :匹配之前的项1或0次
+ :匹配之前的项1次或多次
* :匹配之前的项0或多次
() :创建一个用于匹配的字串
{n} :匹配之前的项n次
{n,} :之前的项至少需要匹配n次
{n,m} :指定之前的项所必需匹配
| :交替匹配|两边的任意一项
\ :转义字符可以将上面的特殊字符进行转义案例:
^linux##以linux开始
@H_301_40@linux$@H_301_40@@H_301_40@##以@H_301_40@linux结束
@H_301_40@linuxfan. ##匹配@H_301_40@linuxfans等
@H_301_40@coo[kl]@H_301_40@@H_301_40@##匹配@H_301_40@cool或@H_301_40@cook
@H_301_40@
@H_301_40@9[^5689] ##匹配@H_301_40@91,92等,但不匹配@H_301_40@95,98等
@H_301_40@[0-9]@H_301_40@@H_301_40@##匹配任意一个所有的数字
@H_301_40@[a-z]|[A-Z]@H_301_40@@H_301_40@##匹配任意一个所有大小写字母@H_301_40@,|属于扩展正则@H_301_40@grep -E支持
@H_301_40@colou?r ##匹配@H_301_40@color或@H_301_40@clolur,但是不能匹配@H_301_40@colouur
@H_301_40@rollno-9+@H_301_40@@H_301_40@##匹配@H_301_40@rollno-9、@H_301_40@rollno-99,@H_301_40@rollno-999,但不匹配@H_301_40@rollno-
@H_301_40@co*l@H_301_40@ @H_301_40@##匹配@H_301_40@cl,@H_301_40@col,@H_301_40@cool,@H_301_40@coool等@H_301_40@
@H_301_40@ma(tri)x@H_301_40@@H_301_40@##匹配@H_301_40@matrix
@H_301_40@[0-9]{3}@H_301_40@@H_301_40@##匹配任意一个三位数,等于@H_301_40@[0-9][0-9][0-9]
@H_301_40@
@H_301_40@[0-9]{2,} ##匹配任意一个两位数或更多位的数字
@H_301_40@[0-9]{2,5} ##匹配从两位数到五位数之间的任意一个数字
@H_301_40@Oct (1st | 2nd) ##匹配@H_301_40@Oct 1st或@H_301_40@Oct 2nd
@H_301_40@a\.b@H_301_40@@H_301_40@##匹配@H_301_40@a.b,但不能匹配@H_301_40@ajb
@H_301_40@[a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4}@H_301_40@ @H_301_40@##匹配一个邮箱地址
@H_301_40@[0-9]{1,3}\.[0-9]{1,3}@H_301_40@ @H_301_40@##匹配@H_301_40@IP地址
@H_301_40@[root@ns ~]# cat /proc/meminfo |grep@H_301_40@ @H_301_40@-e Mem -e Cache -e Swap@H_301_40@ @H_301_40@##查看系统内存、缓存、交换分区@H_301_40@-e的作用是匹配多个表达式
[root@ns ~]# grep -R -o -n -E'[a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4}' /etc/ ##查找/etc目录下的所有文件中的邮件地址;-R递归,-n表示匹配的行号,-o只输出匹配内容,-E支持扩展正则表达式,
@H_301_40@[root@ns ~]# grep -R -c 'HOSTNAME' /etc/ |grep -v "0$"@H_301_40@ @H_301_40@##查找@H_301_40@/etc/目录下文件中包含“@H_301_40@HOSTNAME”的次数,@H_301_40@-c统计匹配次数,@H_301_40@-v取反
@H_301_40@[root@ns ~]# grep -R -l 'HOSTNAME' /etc/@H_301_40@ @H_301_40@##查找包含“@H_301_40@HOSTNAME”的文件名,@H_301_40@-l显示匹配的文件名,@H_301_40@-L显示不匹配的文件名
@H_301_40@[root@ns ~]# dmesg | grep -n --color=auto 'eth'@H_301_40@ @H_301_40@##查找内核日志中@H_301_40@eth的行,显示颜色及行号
@H_301_40@[root@ns ~]# dmesg | grep -n -A3 -B2 --color=auto 'eth'@H_301_40@ @H_301_40@##用@H_301_40@ dmesg 列出核心信息,再以@H_301_40@grep 找出内含@H_301_40@ eth 那行@H_301_40@,在关键字所在行的前两行与后三行也一起找出出来显示
@H_301_40@[root@ns ~]# cat /etc/passwd |grep -c bash$@H_301_40@ @H_301_40@##统计系统中能登录的用户的个数
@H_301_40@[root@ns tmp]# touch /tmp/{123,123123,456,1234567}.txt@H_301_40@ @H_301_40@##创建测试文件,以下三条命令是一样的效果,匹配文件名@H_301_40@123,可以包含@H_301_40@1个到多个
@H_301_40@[root@ns tmp]# ls |grep -E '(123)+'
@H_301_40@[root@ns tmp]# ls |grep '\(123\)\+'
@H_301_40@[root@ns tmp]# ls |egrep@H_301_40@ @H_301_40@'(123)+'
[root@ns ~]# ps -ef |grep -c httpd ##统计httpd进程数量
@H_301_40@[root@ns ~]# grep -C 4 'games' --color /etc/passwd@H_301_40@ @H_301_40@##显示@H_301_40@games匹配的“@H_301_40@-C”前后@H_301_40@4行
@H_301_40@[root@ns ~]# grep ^adm /etc/group@H_301_40@ @H_301_40@##查看@H_301_40@adm组的信息
@H_301_40@[root@ns ~]# ip a |grep -E '^[0-9]' |awk -F : '{print $2}'@H_301_40@ @H_301_40@##获取网卡名称
@H_301_40@[root@ns ~]# ifconfig eth0 |grep -E -o 'inet addr:[^ ]*' |grep@H_301_40@ @H_301_40@-o '[0-9.]*'@H_301_40@ @H_301_40@##截取@H_301_40@ip地址,@H_301_40@[^ ]*
表示以非空字符作为结束符,@H_301_40@[0-9.]*表示数字和点的组合
@H_301_40@[root@ns ~]# ifconfig eth0 |grep -i hwaddr |awk '{print $5}'@H_301_40@ @H_301_40@##截取@H_301_40@MAC地址
测试文档:使用@H_301_40@grep -E命令练习正则表达式
@H_301_40@[root@ns tmp]# cat test.txt
@H_301_40@ABcd
@H_301_40@10.10.10.10
@H_301_40@color
@H_301_40@colur
@H_301_40@linuxfan2
@H_301_40@colouur
@H_301_40@rollno-9
@H_301_40@i like linux
@H_301_40@linux funny.
@H_301_40@I am linuxfan.
@H_301_40@rollno-99
@H_301_40@rollno-999
@H_301_40@cl
@H_301_40@col
@H_301_40@cool
@H_301_40@coool
@H_301_40@cook
@H_301_40@max
@H_301_40@matrix
@H_301_40@192.168.100.100
@H_301_40@123456789
@H_301_40@123123123
@H_301_40@123123
@H_301_40@23346123
@H_301_40@123
@H_301_40@12
@H_301_40@12345
@H_301_40@94
@H_301_40@95
@H_301_40@96
@H_301_40@97
@H_301_40@98
@H_301_40@99
@H_301_40@100
@H_301_40@Oct 1st
@H_301_40@Oct 2nd
@H_301_40@a.b
@H_301_40@ajb
@H_301_40@abc
@H_301_40@linuxfan@qq.com
@H_301_40@linux
@H_301_40@[root@ns tmp]#