文本三剑客之grep及正则表达式用法
一、文本三剑客之grep介绍
grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。
1.Linux文本处理三剑客:
grep:文本过滤工具
sed:文本编辑工具(传送门)
awk:Linux上的实现gawk,文本报告生成器(传送门)
grep,基于行过滤的文本过滤工具
格式:
grep [OPTION]… PATTERN [FILE]…
option:
-v 显示不被匹配到的行
-i 忽略字符大小写
-n 添加匹配到的行的行号
-c 统计被匹配到的行数
-o 仅显示匹配到的字符
-q 静默模式
-A# 包含此匹配行和后#行
-B# 包含此匹配行和前#行
-C# 包含此匹配行和前后#行
-e 实现多个匹配字符的或者(or)关系 -e a -e b:a或b
-w 匹配整个单词,数字、字母、下划线都算单词一部分
-r 递归目录
-E 使用ERE,扩展的正则表达式
-F 相当于fgrep
grep工具之所以功能强大,是因为它支持正则表达式进行匹配,那什么又是正则表达式呢?
二.正则表达式的相关概念
1.正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。
元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式
正则表达式(REGEXP):由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符表面意义,而表示控制或通配功能
2.正则表达式与通配符的区别
通配符匹配的是文件名中的字符,不能匹配文件的文本内容的字符串(详见前篇:带你认识Linux中的通配符),这时候就需要用到正则表达式。
3.正则表达式分两类
基本正则表达式:BRE;只承认的元字符有^$.[]*其他字符识别为普通字符:()需要转义
扩展正则表达式:ERE;则添加了(){}?+| 等 grep -E,egrep
4.正则表达式引擎
采用不同算法,检查处理正则表达式的软件模块
基于PCRE语言(逐渐没落)兼容的正则表达式
5.元字符分类
字符匹配、匹配次数、位置锚定、分组(帮助文档:man 7 regex)
三、基本正则表达式(BRE)的元字符介绍:
1.字符匹配:
. 匹配任意单个字符,放在[]中就表示点
[] 匹配括号内任意单个字符
[^] 匹配指定范围外的任意单个字符
[:alnum:] 任意一个字母和数字
[:alpha:] 任意一个字母
[:lower:] 任意一个小写字母
[:upper:] 任意一个大写字母
[:digit:] 任意一个数字
[:space:] 水平或垂直空白字符
[:punct:] 标点符号
注意:正则表达式使用字符集作为搜索条件时,一定要加双引号,如”[[:digit:]]”;否则正则表达式会将字符集作为一个个字符进行识别
转义符“\”使正则表达式中具有特殊含义的字符显示其本身,如.只表示小数点
2.匹配次数(某个字符出现的次数)
* 匹配前面的字符任意次,包括0次(贪婪模式,尽可能长的匹配)
.* 任意长度的任意字符
\? 匹配前面的字符0或1次,可看做 {0,1}
+ 匹配前面的字符至少1次,可看做{1,}(可实现懒惰模式)
{m} 精确匹配前面的字符m次
{m,} 至少匹配前面的字符m次
{,m} 至多匹配前面的字符m次
{m,n}匹配前面的字符m到n次
3.位置锚定
^ 行首锚定,用于模式最左侧
$ 行尾锚定,用于模式最右侧
^$ 表示空行
\<或\b 单词的词首锚定
>或\b 单词的次尾锚定
\<word> 匹配整个单词,同grep -w
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.次数匹配:
* 匹配前面字符任意次
? 0或1次,可看做{0,1}
+ 1次或多次.可看做{1,}
{m} 匹配m次
{m,n} 匹配m到n次
2.位置锚定:
^ 行首
$ 行尾
\<,\b 语首
>,\b 语尾
3.分组:
()
后向引用:\1,\2,…
4.或者:
a|b a或b
C|cat C或cat
(C|c)at Cat或cat
五、正则表达式中的元字符与通配符的区别
作用不同:通配符匹配的是文件名中的字符,而正则表达式匹配的是文件的文本内容的字符串;
两者之间有很多相同之处,也有不同点,其中:
1.正则表达式元字符与通配符代表意义不同的有:
######通配符中:
* 表示任意长度的任意字符
? 表示任意一个单个字符
######正则表达式:
*表示匹配前面的字符任意次
. 表示匹配任意一个单个字符
.*表示任意长度的任意字符
#####2.正则表达式元字符与通配符含义相似的有:
[] 匹配括号内任意单个字符
[^] 匹配指定范围外的任意单个字符
[:alnum:] 任意一个字母和数字
[:alpha:] 任意一个字母
[:lower:] 任意一个小写字母
[:upper:] 任意一个大写字母
[:digit:] 任意一个数字
[:space:] 水平或垂直空白字符
[:punct:] 标点符号