Linux 正则表达式详解
本博客一直缺少linux正则表达式的内容,今天就补充一下。
一.正则表达式初步介绍
1,什么是正则表达式
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
2,使用场景。
最常见的,无非是我们平时命令和脚本使用中用到,比如grep、awk和sed做一些匹配检索。当然,程序开发或者环境配置当中需要用到的一些正则表达式,比如php判断、nginx中的location配置、其他web或者程序的规则等。
二.正则表达式简要介绍
1.正则表达式的组成
(1).一般字符:没有特殊意义的字符
(2).特殊字符(meta字符):元字符,有在正则表达式中有特殊意义
2.如下讲下正则表达式中的常见meta字符
(1).BRE与ERE中都有的meta字符,通用:
: 通常用于打开或关闭后续字符的特殊含义,如(…)与{…}
. : 匹配任何单个字符(除NUL)
* : 匹配其前的任何数目或没有的单个字符,例: . 表示任一字符, 则 .* 匹配任一字符的任意长度
^ : 以什么开头。
$ : 以什么结尾。
[] : 匹配方括号内的任一字符,其中可用连字符(-)指的连续字符的范围;^符号苦出现在方括号的第一个位置,则表示匹配不在列表中的任一字符
中括号这个特定说明下:
1>匹配具体数字: 写入正则表达式需要转义。比如:
ifconfig | grep -E '< [0-9]>|< [0-9][0-9]>|< [1-2][0-5][0-5]>' -o
2>匹配具体字符串 尖括号b,同样需要转义
(2).BRE中才有的字符:
{n,m} : 区间表达式,匹配在它前面的单个字符重现的次数区别。{n}指重现n次; {n,m}指重现n至m次;
( ) : 保留空间,可以将最多9个独立的子模式存储在单个模式中。如(ab).*1 : 指匹配ab组合的两次重现,中间可存在任意数目的字符。
: 重复在(与)方括号内第n个子模式至此点的模式。
(3)ERE中才有的字符(这个如何结合grep使用需要加-E参数,或者采用egrep):
{n,m} : 与BRE的{n,m}功能相同
+ : 匹配前面正则表达式的一个或多个扩展
? : 匹配前面正则表达式的零个或一个扩展
| : 匹配|符号前或后的正则表达式
( ) : 匹配方括号括起来的正则表达式群
比如linux上常用的nosql中,过滤redis配置文件中的注释行和空白行,可以用如下命令:
方法1:cat /etc/redis.conf | grep -Ev '^#|^$' 方法2:cat /etc/redis.conf | grep -v '^#' | grep -v '^$'
(4). 方括号([])表达式
4.1.字符集 [: :]
标识字符集,有如下几种:
[::alnum] : 数字字符 | [:digit:] : 数字字符 | [:punct:] : 标点符号字符 |
[:alpha:] : 字母字符 | [:graph:] : 非空格字符 | [:space:] : 空格字符 |
[:blank:] : 空格与定位字符 | [:lower:] : 小写字母字符 | [:upper:] : 大写字母字符 |
[:cntrl:] : 控制字符 | [:print:] : 可显示的字符 | [:xdigit:] : 16进制数字 |
4.2.排序符号
指将多个字符视为一个符号,如[.ch.]即将ch视为一个符号
4.3.等价字符
认为多个字符相等,如[=e=]在法文的locale里,可匹配于多种与e相似的字符,此处不再列出。
说明:这三种构造除其自身的方括号之外,还必须使用额外的方括号括起来。
例 : [[:alpha:]!] : 匹配任一英文字母或感叹号。
[[.ch.] : 匹配ch排序元素,而不匹配单独的字母c或h.
3.简单正规表达式匹配案例
china : 匹配此行中任意位置有china字符的行
^china : 匹配此以china开关的行
china$ : 匹配以china结尾的行
^china$ : 匹配仅有china五个字符的行
[Cc]hina : 匹配含有China或china的行
Ch.na : 匹配包含Ch两字母并且其后紧跟一个任意字符之后又有na两个字符的行
Ch.*na : 匹配一行中含Ch字符,并且其后跟0个或者多个字符,再继续跟na两字符
二.实例
如下通过常用实例来学习BRE和ERE匹配,源文件url.txt内容如下:
www.baidu.com
http://www.baidu.com
https://www.baidu.com
http://wwwbaiducom
baidu.com
baidu
1.url匹配
匹配以http或者https开头,并且其后为:并且含有.的串
BRE匹配:
grep ‘^https{0,1}.*..*’ url.txt
ERE匹配:
grep -E ‘^https?.*..*’ url.txt
匹配结果如下:
http://www.baidu.com
https://www.baidu.com
2.Email匹配
示例文件内容为:
[email protected]
[email protected]
[email protected]
[email protected]
@@baidu.com
匹配以字母数字或者下划线开头的多个字符,其后有一个@之后有多个字母数字或者下划线,其中有一个.号
grep ‘^[[:alpha:][:digit:]_]*@[[:alpha:][:digit:]]*..*’ email.txt
匹配结果:
[email protected]
[email protected]
[email protected]
参考资料:
1,百度正则表达式。
2,Linux 正则表达式详解http://www.jb51.net/article/42989.htm