参考资料:鳥哥私房菜 - 第十一章、正規表示法與文件格式化處理
1. 什么是正则表达式
正则表达式(Regular Expression,简称RE)是一种处理字符串的方法,它以行为单位进行字符串的处理操作。通过一些特殊符号的辅助,可以轻松实现字符串的搜索、删除、替换。
1.1 正则表达式的重要性
- 系统管理员每天需要处理大量日志、分析系统状态、监控网络流量,这些任务都离不开正则表达式
- 只要掌握正则表达式,就能用简单的字符串处理来解决问题,而无需编写复杂的程序
- 正则表达式是Shell Script的基础工具,也是许多Unix命令的核心功能
1.2 正则表达式与通配符的区别
重要概念:正则表达式的特殊字符与命令行中的通配符并不相同:
| 对比项 |
通配符 |
正则表达式 |
* 含义 |
0到无穷多个任意字符 |
重复前一个字符0到无穷多次 |
| 使用场景 |
命令行文件名匹配 |
字符串内容处理 |
| 示例 |
ls *.txt |
grep 'o*' file |
1.3 正则表达式的两种类型
| 类型 |
说明 |
工具支持 |
| 基础正则表达式 |
基本的字符匹配和重复功能 |
grep, sed |
| 扩展正则表达式 |
增加分组、选择等高级功能 |
grep -E, egrep, awk |
2. 基础正则表达式
2.1 基础正则表达式元字符
| 元字符 |
功能说明 |
示例 |
^ |
行首定位符 |
^the 匹配以the开头的行 |
$ |
行尾定位符 |
!$ 匹配以!结尾的行 |
. |
匹配任意一个字符 |
t.st 匹配 tast、tost 等 |
* |
重复前一个字符0到无穷多次 |
o* 匹配空、o、oo、ooo… |
[list] |
匹配list中的任意一个字符 |
t[ae]st 匹配 tast 或 test |
[n1-n2] |
匹配范围中的任意一个字符 |
[0-9] 匹配任意数字 |
[^list] |
反向选择,匹配不在list中的字符 |
[^a-z] 匹配非小写字母 |
\{n,m\} |
连续n到m个前一个字符 |
o\{2,5\} 匹配2-5个o |
\ |
转义字符,将特殊符号变为普通字符 |
\. 匹配点号本身 |
2.2 行首与行尾符号
^ 符号的双重含义:^ 在字符集合符号(括号 [])之内与之外是不同的:
| 位置 |
含义 |
示例 |
[] 之外 |
行首定位符 |
^the 匹配以the开头的行 |
[] 之内 |
反向选择 |
[^a-z] 匹配非小写字母 |
查找空白行:^$ 表示没有字符的行,即空白行。
2.3 任意字符与重复字符
| 元字符 |
含义 |
说明 |
. |
一定有一个任意字符 |
占位符,匹配除换行符外的任一字符 |
* |
重复前一个字符0到无穷多次 |
是组合形态,需与前一个字符配合 |
.* |
零个或多个任意字符 |
最常用的组合,匹配任意内容 |
2.4 限定连续RE字符范围
使用 {} 来限定连续字符的范围。注意:{ 与 } 在Shell中有特殊意义,必须使用转义字符 \ 来使其失去特殊意义。
1 2
| grep -n 'o\{2\}' regular_express.txt grep -n 'o\{2,5\}' regular_express.txt
|
2.5 基础正则表达式练习示例
| 任务 |
正则表达式 |
说明 |
| 搜索特定字符串 |
grep -n 'the' file |
搜索包含”the”的行 |
| 忽略大小写搜索 |
grep -in 'the' file |
-i 忽略大小写 |
| 搜索test或tast |
grep -n 't[ae]st' file |
利用中括号 |
| 搜索非a-z字符 |
grep -n '[^a-z]' file |
反向选择 |
| 搜索以the开头的行 |
grep -n '^the' file |
行首定位符 |
| 搜索以.结尾的行 |
grep -n '\.$' file |
转义点号 |
3. 扩展正则表达式
3.1 扩展正则表达式元字符
| 元字符 |
功能说明 |
示例 |
+ |
重复前一个字符一次或以上 |
go+ 匹配 go、goo、gooo |
? |
重复前一个字符零次或一次 |
go? 匹配 g、go |
| |
或(or) |
good|nice 匹配good或nice |
() |
分组 |
g(la|oo)d 匹配 glad 或 good |
()+ |
分组重复 |
A(xyz)+ 匹配 Axyz、Axyzxyz |
3.2 使用扩展正则表达式
1 2
| grep -E 'good|nice' file egrep 'good|nice' file
|
3.3 grep 常用选项汇总
| 选项 |
功能 |
-c |
计算匹配的行数 |
-i |
忽略大小写 |
-n |
显示行号 |
-v |
反向选择(显示不匹配的行) |
-w |
匹配整个单词 |
-E |
支持扩展正则表达式 |
-A n |
显示匹配行及其后 n 行(after) |
-B n |
显示匹配行及其前 n 行(before) |
-C n |
显示匹配行及其前后各 n 行(context) |
--color=auto |
将匹配的关键字着色显示 |
4. 文件格式化处理工具:sed
sed 本身也是一个管道命令,可以对数据进行取代、删除、新增、撷取特定行等操作。
4.1 sed 命令格式
4.2 sed 常用选项
| 选项 |
功能 |
-n |
安静模式,只显示经过特殊处理的行 |
-e |
直接在命令行进行sed动作编辑 |
-f |
将sed动作写入文件,执行文件内的sed动作 |
-r |
支持扩展正则表达式语法 |
-i |
直接修改文件内容(谨慎使用) |
4.3 sed 动作说明(function)
| 动作 |
功能 |
说明 |
a |
新增 |
在指定行的下一行添加字符串 |
c |
取代 |
替换指定行的内容 |
d |
删除 |
删除指定行 |
i |
插入 |
在指定行的上一行插入字符串 |
p |
打印 |
打印匹配的行(常与 -n 配合) |
s |
取代 |
进行字符串替换,可搭配正则表达式 |
4.4 sed 使用示例
删除操作:
1 2
| nl /etc/passwd | sed '2,5d' nl /etc/passwd | sed '2d'
|
新增与插入:
1 2
| nl /etc/passwd | sed '2a drink tea' nl /etc/passwd | sed '2i drink tea'
|
取代操作:
1
| nl /etc/passwd | sed '2,5c No 2-5 number'
|
打印操作:
1
| nl /etc/passwd | sed -n '5,7p'
|
字符串替换:
1 2 3
| sed 's/old/new/g' file sed 's/^.*addr://g' file sed -i 's/old/new/g' file
|
5. 文件的格式化与相关操作
5.1 格式化打印:printf
1
| printf '%10s %5i %5.2f\n' $(cat file)
|
%ns:n个字符的字符串
%ni:n位整数
%n.mf:整数n位,小数m位的浮点数
5.2 awk:好用的数据处理工具
awk 相比于sed更倾向于将一行分成数个字段来处理。
1
| awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
|
awk内置变量:
| 变量 |
含义 |
NF |
每行拥有的字段总数 |
NR |
当前处理的行号 |
FS |
当前的分隔符,默认为空格 |
$0 |
整行数据 |
$1 |
第一个字段 |
$2 |
第二个字段 |
awk使用示例:
1 2 3 4
| last -n 5 | awk '{print $1 "\t" $3}' awk '{print NR " " NF " " $1}' file awk 'NR==1{print $1}' file awk '{if(NR<3) print $1}' file
|
5.3 文件比对工具
diff:比较文件的差异
1
| diff [-bBi] from-file to-file
|
-b:忽略一行中多个空白的差异
-B:忽略空白行的差异
-i:忽略大小写
cmp:以字节为单位比较文件
patch:使用diff生成的补丁文件更新文件
1 2
| diff -Naur old new > file.patch patch -p0 < file.patch
|
5.4 文件打印准备:pr
6. 本章重点命令速查
| 分类 |
命令/工具 |
用途 |
| 搜索 |
grep |
正则表达式搜索文本 |
|
egrep |
扩展正则表达式搜索 |
| 替换/编辑 |
sed |
流编辑器,替换、删除、新增 |
| 数据处理 |
awk |
字段处理和分析 |
| 格式化输出 |
printf |
格式化打印 |
| 文件比对 |
diff |
比较文件差异 |
|
cmp |
字节级比较 |
|
patch |
应用补丁文件 |
| 打印准备 |
pr |
格式化文件为打印格式 |
7. 核心要点
7.1 正则表达式的核心思想
- 正则表达式是处理字符串的方法,以行为单位进行操作
- 通过特殊符号的组合,实现搜索、删除、替换功能
- 区分正则表达式与通配符:通配符用于文件名匹配,正则表达式用于内容处理
7.2 基础正则表达式 vs 扩展正则表达式
| 对比项 |
基础正则表达式 |
扩展正则表达式 |
| 工具 |
grep, sed |
grep -E, egrep, awk |
| 分组 |
不支持 () |
支持 () |
| 或运算 |
不支持 ` |
` |
| 一次或多次 |
不支持 + |
支持 + |
7.3 sed vs awk 对比
| 对比项 |
sed |
awk |
| 处理单位 |
行 |
字段 |
| 主要功能 |
替换、删除、新增 |
字段分析、计算 |
| 编程能力 |
简单 |
较强(支持条件判断) |
| 典型场景 |
文本替换 |
数据报表 |