grep 是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。
一、grep、文本过滤工具
格式:
grep [OPTION]… PATTERN [FILE]…
option:
1 | -v 显示不被匹配到的行 |
grep工具之所以功能强大,是因为它支持正则表达式进行匹配,那什么又是正则表达式呢?
二、正则表达式的相关概念
正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。元字符使正则表达
式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规
定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式正则表达式(REGEXP):
由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符表面意义,
而表示控制或通配功能
正则表达式与通配符的区别:通配符匹配的是文件名中的字符,不能匹配文件的文本内容的字符串,
这时候就需要用到正则表达式。
正则表达式分两类:
基本正则表达式:BRE;只承认的元字符有^$.[]*其他字符识别为普通字符:()需要转义
扩展正则表达式:ERE;则添加了(){}?+|等
grep -E 等价于 egrep
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块
基于PCRE语言(逐渐没落)兼容的正则表达式
- 元字符分类:字符匹配、匹配次数、位置锚定、分组(帮助文档:man 7 regex)
三、基本正则表达式(BRE)的元字符介绍:
1. 字符匹配:
1 | . 匹配任意单个字符,放在[]中就表示点 |
注意:正则表达式使用字符集作为搜索条件时,一定要加双引号,如”[[:digit:]]”;
否则正则表达式会将字符集作为一个个字符进行识别
转义符“\”使正则表达式中具有特殊含义的字符显示其本身,如.只表示小数点
2. 匹配次数(某个字符出现的次数)
1 | *- 匹配前面的字符任意次,包括0次(贪婪模式,尽可能长的匹配) |
3. 位置锚定
1 | ^ 行首锚定,用于模式最左侧 |
4. 分组
()将一个或多个字符捆绑在一起,当做一个整体进行处理,如:(root)+
分组括号中匹配到的内容会被正则表达式记录与内部变量中,
这些变量命名方式为:\1,\2,\3,…
\1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
后向引用:\1表示的是前面匹配的结果而不是前面匹配的模式
例:echo rootxxrbbt|grep ‘(r..t).*\1’
\1代表root,而不是r..t
5. 或者:|
例:a|b:a或b; C|cat:C或cat \(C|c\)at:Cat或cat
四、扩展正则表达式(ERE)介绍:
egrep 同grep -E
扩展正则表达式(ERE)可理解为将基础正则表达式中的转义符全部去掉,其字符匹配与基础正则表达式(BRE)相同。
1. 字符匹配
1 | . 任意单个字符 |
2.次数匹配:
1 | * :匹配前面字符任意次 |
3.位置锚定:
1 | ^ : 行首 |
4.分组:
1 | () |
5.或者:
1 | a|b a或b |
五、正则表达式中的元字符与通配符的区别
作用不同:通配符匹配的是文件名中的字符,而正则表达式匹配的是文件的文本内容的字符串;
两者之间有很多相同之处,也有不同点,其中:
1.正则表达式元字符与通配符代表意义不同的有:
通配符中:
* 表示任意长度的任意字符
? 表示任意一个单个字符
正则表达式:
*表示匹配前面的字符任意次
. 表示匹配任意一个单个字符
.*表示任意长度的任意字符
2. 正则表达式元字符与通配符含义相似的有:
1 | [] 匹配括号内任意单个字符 |