Linux学习日志(8) 正则表达式与文件格式化处理

参考资料:鳥哥私房菜 - 第十一章、正規表示法與文件格式化處理

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    # 查找连续两个o
grep -n 'o\{2,5\}' regular_express.txt # 查找连续2-5个o

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   # 使用 -E 选项
egrep 'good|nice' file # 或使用 egrep 命令

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 命令格式

1
sed [-nefr] [动作]

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'        # 删除2-5行
nl /etc/passwd | sed '2d' # 删除第2行

新增与插入

1
2
nl /etc/passwd | sed '2a drink tea'   # 第2行后添加
nl /etc/passwd | sed '2i drink tea' # 第2行前插入

取代操作

1
nl /etc/passwd | sed '2,5c No 2-5 number'  # 将2-5行替换

打印操作

1
nl /etc/passwd | sed -n '5,7p'     # 只打印5-7行

字符串替换

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}'   # 打印第1和第3字段
awk '{print NR " " NF " " $1}' file # 显示行号、字段数、第1字段
awk 'NR==1{print $1}' file # 仅处理第1行
awk '{if(NR<3) print $1}' file # 条件判断

5.3 文件比对工具

diff:比较文件的差异

1
diff [-bBi] from-file to-file
  • -b:忽略一行中多个空白的差异
  • -B:忽略空白行的差异
  • -i:忽略大小写

cmp:以字节为单位比较文件

1
cmp file1 file2

patch:使用diff生成的补丁文件更新文件

1
2
diff -Naur old new > file.patch   # 生成补丁
patch -p0 < file.patch # 打补丁

5.4 文件打印准备:pr

1
2
pr file              # 为文件添加页眉、页脚
pr -l 50 file # 每页50行

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
处理单位 字段
主要功能 替换、删除、新增 字段分析、计算
编程能力 简单 较强(支持条件判断)
典型场景 文本替换 数据报表