Linux 文本处理神器——sed
文章目录
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 看似语法复杂,但掌握核心逻辑后,会发现它是“一劳永逸”的文本处理工具——无论是日常运维还是自动化脚本编写,都能大幅提升效率。建议从简单场景(如筛选行、替换字符)开始练习,逐步过渡到复杂脚本,很快就能熟练掌握!
更多推荐



所有评论(0)