## 1、正则表达式概览 正则表达式(Regular Expression)用于描述一类字符串匹配规则,在 Linux 中常与 `grep`、`sed`、`awk` 等命令搭配使用。 常见场景: - 匹配日志中的特定格式 - 过滤 IP、端口、用户名等文本 - 批量替换字符串 - 校验输入格式 ## 2、基本字符匹配 ### 2.1 `.` - `.`:匹配任意单个字符 示例: ```shell a.c ``` 可以匹配:`abc`、`a1c`、`a-c` ### 2.2 `[]` - `[]`:匹配指定范围中的任意单个字符 示例: ```shell [0-9] [a-z] [A-Z] ``` ### 2.3 `[^]` - `[^...]`:匹配不在指定范围内的任意单个字符 示例: ```shell [^0-9] ``` 表示匹配任意一个非数字字符。 ## 3、匹配次数 ### 3.1 `*` - `*`:匹配前一个字符 **0 次或多次** 示例: ```shell ab*c ``` 可以匹配:`ac`、`abc`、`abbc` ### 3.2 `.*` - `.*`:匹配任意长度的任意字符 这个组合在日志处理里非常常见。 ### 3.3 `?` 在基本正则中通常写作 `\?`,表示: - 前一个字符 **0 次或 1 次** ### 3.4 `+` 在基本正则中通常写作 `\+`,表示: - 前一个字符 **至少 1 次** ### 3.5 `{}` 在基本正则中通常写作转义形式: - `\{n\}`:前一个字符恰好出现 `n` 次 - `\{m,n\}`:前一个字符出现 `m` 到 `n` 次 - `\{,n\}`:前一个字符最多出现 `n` 次 - `\{n,\}`:前一个字符至少出现 `n` 次 ## 4、位置锚定 - `^`:行首 - `$`:行尾 - `^$`:空行 示例: ```shell ^root ``` 表示匹配以 `root` 开头的行。 ```shell bash$ ``` 表示匹配以 `bash` 结尾的行。 ## 5、分组与或关系 ### 5.1 `\|` 在基本正则中,`\|` 表示“或者”。 示例: ```shell root\|admin ``` 表示匹配 `root` 或 `admin`。 ### 5.2 `()` 在扩展正则中,分组通常使用 `()`;在部分基本正则工具中可能需要转义。 ## 6、基本正则与扩展正则 ### 6.1 基本正则 BRE 常见于: - 默认 `grep` - 默认 `sed` 其中 `?`、`+`、`{}`、`|` 往往要写成转义形式。 ### 6.2 扩展正则 ERE 常见于: - `grep -E` - `egrep` - `sed -r` 扩展正则写法更自然,例如: ```shell grep -E 'root|admin' file.txt ``` ## 7、常见示例 ### 7.1 匹配空行 ```shell grep '^$' file.txt ``` ### 7.2 匹配注释行 ```shell grep '^#' file.txt ``` ### 7.3 匹配数字 ```shell grep '[0-9]' file.txt ``` ### 7.4 匹配以 `.log` 结尾的文件名 ```shell grep '\.log$' file.txt ``` ## 8、小结 - 正则表达式用于描述字符串匹配规则 - `.`、`[]`、`*`、`^`、`$` 是最基础也是最高频的元字符 - BRE 和 ERE 的主要区别在于部分符号是否需要转义 - 学会正则后,`grep`、`sed`、`awk` 的能力会明显提升