Linux 文本处理神器——sed
文章目录
- Linux 文本处理神器:sed 命令从入门到实战全指南
- 一、认识 sed:它是什么,如何工作?
- 1. sed 核心定位
- 2. 必须理解的工作原理
- 二、sed 命令基础:格式、选项与动作
- 1. 两种核心命令格式
- 2. 常用选项(新手必记)
- 3. 核心动作指令(实现文本操作)
- 三、sed 实战:从基础到进阶场景
- 1. 筛选输出文本(`p` 动作 + `-n` 选项)
- 2. 删除文本行(`d` 动作)
- 3. 替换文本内容(`s` 动作,最常用)
- 4. 迁移与追加文本(`H`/`G`/`w`/`r` 动作)
- 5. 分组操作(`{}` 语法)
- 四、生产环境实战案例
- 案例1:批量修改网卡 IP 地址
- 案例2:修改 Apache 服务配置
- 案例3:编写 vsftpd 配置自动化脚本
- 五、sed 学习总结与避坑指南
- 1. 核心知识点回顾
- 2. 避坑指南
Linux 文本处理神器:sed 命令从入门到实战全指南
在 Linux 系统管理和日常运维中,文本处理是高频需求——无论是修改配置文件、筛选日志内容,还是批量编辑数据,都离不开高效的工具。而 sed(Stream Editor,流编辑器) 作为其中的“元老级”工具,凭借其强大的脚本化编辑能力,成为处理文本的“瑞士军刀”。本文将从原理、基础用法到生产实战,带你彻底掌握 sed 命令。
一、认识 sed:它是什么,如何工作?
1. sed 核心定位
sed 是一款基于脚本的流编辑器,主要用于:
- 自动编辑单个或多个文本文件;
- 简化重复的文本处理操作(如批量替换配置项);
- 编写文本转换程序(如日志格式标准化)。
它最大的特点是“逐行处理”——无需打开文件,即可通过指令对文本流进行高效操作。
2. 必须理解的工作原理
sed 的工作流程围绕 “模式空间”(临时缓冲区)展开,核心分为三步:读取 → 执行 → 显示,具体逻辑如下:
- 读取:从输入流(文件、管道、标准输入)中逐行读取内容,存入“模式空间”(清空原有数据);
- 执行:按预设指令顺序处理模式空间的内容。若指定了行地址(如“3-5行”“包含the的行”),仅对匹配行执行指令;未指定则对所有行执行;
- 显示:将处理后的内容输出到屏幕(默认),随后清空模式空间;
- 循环:重复上述步骤,直到所有行处理完毕。
⚠️ 关键注意点:默认情况下,sed 仅操作“模式空间”的临时数据,不会修改源文件!若需修改源文件,需用 -i
选项(直接编辑)或重定向(>
,输出到新文件)。
二、sed 命令基础:格式、选项与动作
1. 两种核心命令格式
sed 的用法分为“直接指令”和“脚本文件”两种,按需选择:
- 直接指定指令(简单场景):
sed [选项] '操作' 文件名
例:sed -n '3p' demo
(显示 demo 文件第3行) - 调用脚本文件(复杂场景):
sed [选项] -f 脚本文件 文件名
例:sed -f edit.sed demo
(执行 edit.sed 中的指令处理 demo)
2. 常用选项(新手必记)
选项用于控制 sed 的执行方式,以下是高频选项的功能说明:
选项 | 核心功能 | 实用场景 |
---|---|---|
-n | 取消默认输出,仅显示处理后的结果 | 配合 p (打印)动作,避免重复输出 |
-i | 直接编辑源文件(危险!建议加备份) | 批量修改配置文件,如 -i.bak 会生成原文件备份(file.bak ) |
-r | 启用扩展正则表达式 | 无需对 + 、? 、() 等元字符转义,简化正则编写 |
-e | 执行多个编辑指令 | 一次执行多步操作,如 -e 's/a/A/' -e 's/b/B/' |
-f | 读取脚本文件中的指令 | 指令较多时,用脚本文件管理(如10+条操作) |
3. 核心动作指令(实现文本操作)
“动作”是 sed 的“灵魂”,用于指定对文本的具体操作,格式为 [行地址]动作
(行地址可选)。以下是最常用的动作:
动作 | 功能描述 | 示例 |
---|---|---|
p | 打印匹配行内容 | 3p (打印第3行)、/the/p (打印包含the的行) |
d | 删除匹配行 | 3,5d (删除第3-5行)、/^$/d (删除空行) |
s | 字符串替换,格式 s/旧值/新值/选项 | s/the/THE/g (全局替换the为THE)、s/o//g (删除所有o) |
a | 在匹配行下方插入内容 | 3aNew Line (第3行后插“New Line”) |
i | 在匹配行上方插入内容 | /the/iPrefix (包含the的行前插“Prefix”) |
c | 用指定内容替换整行 | 5cHello (第5行替换为“Hello”) |
三、sed 实战:从基础到进阶场景
以下示例均以 demo
文件为操作对象,覆盖日常工作中最常用的文本处理需求。
1. 筛选输出文本(p
动作 + -n
选项)
核心需求:精准显示目标行,避免默认全量输出。
# 1. 显示第3行
sed -n '3p' demo# 2. 显示第3-5行
sed -n '3,5p' demo# 3. 显示所有奇数行(n 表示“读取下一行”,跳过偶数行)
sed -n 'p;n' demo# 4. 显示包含“the”的行
sed -n '/the/p' demo# 5. 显示以“PI”开头的行(^ 匹配行首)
sed -n '/^PI/p' demo# 6. 显示以数字结尾的行($ 匹配行尾)
sed -n '/[0-9]$/p' demo# 🌟 实际场景:提取 ifconfig ens33 的IP地址(结合正则)
ifconfig ens33 | sed -rn '2s/.*inet ([0-9.]+) .*/\1/p'
2. 删除文本行(d
动作)
核心需求:删除不需要的行(如空行、注释行、特定内容行)。
# 1. 删除第3行
sed '3d' demo# 2. 删除第3-5行
sed '3,5d' demo# 3. 删除包含“cross”的行
sed '/cross/d' demo# 4. 删除以小写字母开头的行
sed '/^[a-z]/d' demo# 5. 删除所有空行(^$ 匹配空行)
sed '/^$/d' demo
3. 替换文本内容(s
动作,最常用)
核心需求:批量修改文本中的字符或字符串,支持全局替换、指定行替换等。
# 1. 每行第一个“the”替换为“THE”(默认替换第1个匹配项)
sed 's/the/THE/' demo# 2. 全局替换:所有“the”替换为“THE”(g 表示 global)
sed 's/the/THE/g' demo# 3. 第3-5行的“the”替换为“THE”
sed '3,5s/the/THE/g' demo# 4. 在每行行首插入“#”(注释行)
sed 's/^/#/' demo# 5. 在每行行尾插入“EOF”
sed 's/$/EOF/' demo# 🌟 实际场景:修改 SELinux 配置(启用 SELinux,备份原文件)
sed -i.bak 's/SELINUX=disabled/SELINUX=enforcing/' /etc/selinux/config
4. 迁移与追加文本(H
/G
/w
/r
动作)
核心需求:移动文本位置、保存特定行到新文件、追加外部文件内容。
# 1. 将包含“the”的行移到文件末尾(H:复制到剪贴板;d:删原行;$G:末尾追加)
sed '/the/{H;d};$G' demo# 2. 将包含“the”的行保存到 out.file(w:写入文件)
sed '/the/w out.file' demo# 3. 将 /etc/hostname 的内容追加到包含“the”的行后(r:读取外部文件)
sed '/the/r /etc/hostname' demo# 4. 第3行后插入多行内容(\n 表示换行)
sed '3aNew1\nNew2\nNew3' demo
5. 分组操作({}
语法)
当需要对同一行执行多个指令时,用 {;}
分组,避免重复指定行地址:
# 对包含“root”的行,先替换“root”为“ROOT”,再替换“x”为“X”
sed '/root/{s/root/ROOT/;s/x/X/g}' /etc/passwd
四、生产环境实战案例
sed 的真正价值体现在批量处理和自动化脚本中,以下是三个典型生产场景。
案例1:批量修改网卡 IP 地址
需求:将 ens33
网卡的 IP 地址改为 192.168.10.100
(配置文件路径:/etc/sysconfig/network-scripts/ifcfg-ens33
)
# 直接修改源文件(无备份,谨慎!需备份可加 -i.bak)
sed -i 's/^IPADDR=.*/IPADDR=192.168.10.100/' /etc/sysconfig/network-scripts/ifcfg-ens33
案例2:修改 Apache 服务配置
需求:将 Apache 监听地址改为 192.168.10.100
,端口改为 8080
(配置文件:/etc/httpd/conf/httpd.conf
)
# 1. 修改监听地址
sudo sed -i 's/^Listen .*/Listen 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf# 2. 修改 ServerName(与监听地址一致)
sed -i 's/^ServerName .*/ServerName 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf
案例3:编写 vsftpd 配置自动化脚本
需求:禁止匿名登录,允许本地用户登录并支持写入,同时启动服务并设为开机自启。
# 创建脚本文件 local_only_ftp.sh
vim local_only_ftp.sh
#!/bin/bash
# 定义配置文件路径
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf"
CONFIG="/etc/vsftpd/vsftpd.conf"# 备份原配置(仅当备份不存在时执行)
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak# 1. 禁用匿名登录(基于样本文件)
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG# 2. 启用本地用户登录和写入权限(多指令用 -e 分隔)
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG# 3. 若无 listen=YES,在文件末尾添加
grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG# 4. 启动服务并设为开机自启
systemctl restart vsftpd
systemctl enable vsftpd# 赋予执行权限并运行
chmod +x local_only_ftp.sh
./local_only_ftp.sh
五、sed 学习总结与避坑指南
1. 核心知识点回顾
- 工作流:逐行处理模式空间,默认不修改源文件;
- 关键选项:
-n
(精准输出)、-i
(直接编辑)、-r
(扩展正则); - 高频动作:
p
(打印)、d
(删除)、s
(替换)、a
/i
(插入); - 实战技巧:复杂指令用脚本文件管理,多指令用分组或
-e
串联。
2. 避坑指南
- 使用
-i
前必备份:直接编辑源文件风险高,建议加备份后缀(如-i.bak
); - 正则转义问题:未用
-r
时,+
、?
、()
等需加\
转义(如\(abc\)
); - 预览结果再执行:修改前先用
-n
预览效果(如sed -n 's/the/THE/gp' demo
),确认无误再用-i
; - 行地址格式:范围行用
n1,n2
(如3,5
),匹配行用/pattern/
(如/the/
)。
sed 看似语法复杂,但掌握核心逻辑后,会发现它是“一劳永逸”的文本处理工具——无论是日常运维还是自动化脚本编写,都能大幅提升效率。建议从简单场景(如筛选行、替换字符)开始练习,逐步过渡到复杂脚本,很快就能熟练掌握!