grep工具
- grep是Linux中常用的文本过滤工具,按照关键字或者正则表达式进行过滤,它是按行匹配的,通常是Linux中处理文本的第一步。
- grep工具采用的是贪婪匹配,即:匹配当前行中所有的匹配内容。
- grep工具如果匹配到了,它的退出码是0,如果没有匹配到,它的退出码是1。
- 选项
-i 忽略大小写的不同
-n 同时输出行号
-v 反向选择,显示出没有'搜寻字符串'内容的一行
-o 只输出文件中匹配到的部分
-q 安静模式匹配
-r/R 递归查找
-E 使用扩展正则匹配
--color 将匹配得到的内容进行语法高亮
正则表达式
1. 概念
- 正则表达式是用于描述一组字符串特征的模式,用来匹配特定的字符串,通过特殊字符+普通字符来进行描述,从而达到文本匹配目的;
- 正则表达式被集成于各种文本编辑器中和文本处理工具中;
- 正则表达式基本与语言无关。
- 正则匹配有三类:基本的正则表达式、扩展的正则表达式、Perl的正则表达式
2. 正则表达式的基本要素
- 字符类
- 数量限定符
- 位置限定符
- 特殊符号
3. 字符类
字符 | 含义 | 举例 |
---|
. | 匹配任意一个字符 | a.可以匹配ab、a1等 |
[] | 匹配括号中的任意一个字符 | [ab2]c可以匹配ac、bc、2c |
- | 在[]内表示字符范围 | [0-9a-f]a可以匹配3a、ba |
^ | 在[]内的开头,匹配除括号中的字符之外的任意一个字符 | [^ab]2可以匹配x2、z2,但是不可以匹配a2、b2 |
[[:xxx:]] | grep工具预定义的一些命令字符类 | [[:alpha:]]匹配一个字母,[[:digit:]]匹配一个数字 |

4. 数量限定符
字符 | 含义 | 举例 |
---|
? | 紧跟在它前面的单元应匹配零次或一次 | [0-9]?a 匹配1a、2a、a |
+ | 紧跟在它前面的单元应匹配一次或多次 | [a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+com 匹配一个email地址 |
* | 紧跟在它前面的单元应匹配零次或多次 | [a-zA-Z_]+[a-zA-Z_0-9]* 匹配C语言的标识符 |
{N} | 紧跟在它前面的单元应精确匹配N次 | [1-9][0-9]{2} 匹配100到999的整数 |
{N,} | 紧跟在它前面的单元应匹配至少N次 | [1-9][[0-9]{2,} 匹配100以上的整数 |
{,M} | 紧跟在它前面的单元应匹配最多M次 | [0-9]{,1} 相当于[0-9] |
{N,M} | 紧跟在它前面的单元应匹配至少N次,最多M次 | ([0-9]{1,3}\.){3}[0-9]{1,3} 匹配IP地址 |
上面的例子a{,3}中,在相关的文档中并未出现,应该是错误或者废弃的用法
5. 位置限定符
字符 | 含义 | 举例 |
---|
^ | 匹配行首的位置 | ^Content匹配位于一行开头的Content |
$ | 匹配行末的位置 | ;$ 匹配位于一行结尾为;号, ^$ 匹配空行 |
\< | 匹配单词开头的位置 | \ |
> | 匹配单词结尾的位置 | p>匹配以p结尾的单词 |
\b | 匹配单词开头或结尾的位置 | \bat\b匹配at,不匹配cat,batch等 |
\B | 匹配非单词开头和结尾的位置 | \Bat\B匹配battery,不匹配attend等 |

- \b用来限定目标串中是否有以指定字符串开头的单词,称之为词界,\b称为非词界
- ^$确定目标串出现的位置,称之为锚点
6. 特殊符号
字符 | 含义 | 举例 |
---|
\ | 转义字符 | \<即将普通字符<转义为单词开头的位置 |
() | 将正则表达式的一部分括起来组成一个单元 | |
| | 连接两个子表达式,表示或的关系 | |
基本正则表达式和扩展正则表达式的区别:
在基本正则的规范下,?+{}|()
应解释为普通字符,要表示上述特殊含义则需要加\
转义。反之,在扩展规范下,?+{}|()
应该被理解为特殊含义,要取字面意义,也要对其进行\
转义。