
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次 |