【linux命令】Linux 正则表达式详解

内容摘要
一.正则表达式初步介绍
1,什么是正则表达式

  正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个
文章正文

一.正则表达式初步介绍

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

代码注释
[!--zhushi--]

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!