Linux正则表达式
通常Linux
的运维工作都需要面对大量的文本内容(含字符串内容),例如:
- 配置文件
- 程序代码
- 命令输出
- 日志文件
面对这些文本内容我们经常会有特定的需求,即从文本中查找出特定的字符串。例如分析程序崩溃时候,要查找带有error
字样的输出,分析日志时,要查找所有的时间戳。
凡此种种都需要我们从文本中提取出特定的字符串。而在我们提取出了字符串之后,Linux
中提供了grep
、awk
、sed
和xarg
等工具来操纵文本,帮助我们完成工作。
因此,在后面讲解grep
、awk
、sed
等Linux三剑客
前,需要讲解正则表达式。因为Linux三剑客
都是使用正则表达式在文件(数据流)中过滤内容的。
正则表达式介绍
正则表达式(Regular Expression
),简称为REGEXP
,是指由一类特殊字符及文本字符所编写的模式。其中有些字符不表示其字面意义,而是用于控制或者通配功能。
正则表达式分两类:
- 基本正则表达式(
Basic Regular Expression
,BRE
) - 扩展正则表达式(
Extend Regular Expression
,ERE
)
此外,正则表达式将字符分为普通字符(如abcd1230#
等字符),以及用于控制、通配等等具有特殊含义的元字符(如^$.[]*
等)。基本上,除了元字符以外的字符都是普通字符。
基本正则表达式的元字符有:
^$.[]*
扩展正则表达式的元字符有:
^$.[]*
+(){}?+|
正则表达式的意义
通过使用正则表达式,Linux管理员可以:
- 处理大量的字符串
- 处理文本
通过正则表达式的辅助,Linux管理员能够快速过滤、替换、处理所需要的字符串、文本,让工作更加高效。
过滤、替换、处理的基础是查找,因此就出现了正则表达式:
- 正则表达式是一套规则和方法
- 正则表达式工作时以行为单位,一次处理一行
- Linux三剑客(
sed
、awk
、grep
)全部支持正则表达式
Linux三剑客
Linux三剑客指的是
sed
、awk
和grep
这三个程序。这三个程序全部都是文本处理工具,其中:
grep
:文本过滤工具,查找工具sed
:流编辑器(Stream Editor),文本编辑器awk
:文本报告生成器,格式化文本,例如将结果以excel表格的形式输出
基本正则表达式
基本正则表达式的元字符,主要有下面三种作用:
- 匹配字符
- 匹配次数
- 位置锚定
元字符具体的介绍如下:
符号 | 作用 |
---|---|
^ |
用于模式的最左侧,例如^oldboy 将匹配以oldboy 单词开头的行 |
$$` | 用于模式的最右侧,例如oldboy$$将匹配以 oldboy`单词结尾的行 |
^$ |
组合符,表示匹配空行。 |
. |
表示匹配一个字符,不匹配空行(\n 字符),例如a. 将会匹配包括a0 、a# 、ac 等等在内的内容 |
\ |
转义字符,\. 表示小数点,而非. 元字符 |
* |
匹配前一个字符,0次或1次以上,例如ht* 将会匹配h 、ht 、htt 等内容 |
.* |
匹配任意长度的任意字符 |
[] |
匹配[] 内任意一个字符,例如h[at] 将会匹配ha 、ht |
[^] |
表示[] 的取反,即不匹配,例如h[^at] 将匹配除了ha 、ht 以外的所有字符 |
<> |
表示匹配<> 内完整的内容,例如<http> 将会匹配出单词http 而不会匹配出单词http |
< /> |
表示单词的左侧、右侧,例如<http 将会匹配出单词http 和https |
扩展正则表达式
字符 | 作用 | ||
---|---|---|---|
+ |
匹配前面的字符一次或多次,例如ht+ 将会匹配ht 、htt 等内容,但是不会匹配h ,注意和* 区分 |
||
[]+ |
匹配[] 内的字符一次或多次,例如[:1]+ 将会匹配: 、:: 、:1 、11: 等 |
||
? |
匹配前面的字符0次或一次,例如ht? 将会匹配h 、ht 而不会匹配htt |
||
` | ` | 表示或的含义,例如` |
将会匹配 echo或 cat` |
() |
表示将() 内的东西视为一个整体 |
||
a{m,n} |
表示匹配前一个字符a 最少m 次,最多n 次 |
||
a{m,} |
表示匹配前一个字符至少m 次 |
||
a{n} |
表示匹配前一个字符恰好n 次 |
||
a{,m} |
表示匹配前一个字符至多m 次 |