一、Sed 的核心工作模型
sed(Stream Editor)是 Linux 系统中最强大的非交互式文本流编辑器。与交互式编辑器(如 Vim)不同,Sed 按行读取输入流到内存中的模式空间(Pattern Space),根据指定的指令规则处理完毕后,直接输出到标准输出,原本的文件默认不会被更改。
Sed 常用操作指令动作一览:
p(print):打印模式空间中的内容(通常搭配-n静默参数使用);d(delete):删除匹配的行;c(change):替换整行内容;s(substitute):行内匹配与替换关键词;=:打印当前行号。
二、过滤与定位打印实战(-n + p)
默认情况下,sed 会将每一行都输出一次。使用 -n 选项可以关闭默认输出,只打印匹配条件的行:
1. 正则匹配过滤特定配置行
bash
# 提取网卡配置文件中的 IP 地址配置
sed -n '/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-eth0
# 输出:IPADDR=192.168.1.100
# 快速过滤磁盘挂载的根分区信息(匹配以 / 结尾的行)
df -h | sed -n '/\/$/p'2. 按精确行号范围截取
bash
# 打印第 1 行、第 3 行与第 6 行的内容
sed -n '1p;3p;6p' /etc/passwd
# 打印第 10 行至第 20 行的日志片段
sed -n '10,20p' app.log
# 打印除第 2 行以外的所有内容(! 表示反转条件)
sed -n '2!p' /etc/hosts三、精准删除数据(d)
d 动作常用于清洗日志脏数据或自动化脚本剔除注释:
bash
# 1. 过滤掉所有以 # 符号开头的注释行
sed '/^#/d' nginx.conf
# 2. 过滤掉所有空白行
sed '/^$/d' app.log
# 3. 组合过滤:同时删除所有注释行与空行(生产排障看配置极其实用)
sed '/^#/d; /^$/d' /etc/redis.conf
# 4. 删除指定行号范围(删除第 1 到 5 行)
sed '1,5d' data.txt
# 5. 反向删除:保留包含 "ERROR" 的行,其余全部删除
sed '/ERROR/!d' app.log四、整行替换与参数更新(c)
c 动作可以直接用全新内容整行覆盖满足条件的行:
bash
# 将包含 127.0.0.1 的配置行直接替换为标准解析
sed '/127.0.0.1/c 127.0.0.1 localhost myhost' /etc/hosts
# 将网卡中的 IPADDR 行替换为新 IP
file="/etc/sysconfig/network-scripts/ifcfg-eth0"
sed '/^IPADDR=/c IPADDR=10.0.1.50' "$file"
# 将文件的第 4 行直接替换为固定字符串
sed '4c allow_remote_access=yes' app.ini五、行内正则替换(s///g)与安全原地修改(-i.bak)
1. 行内替换与全局替换
bash
# 将文件中所有的 http:// 替换为 https://(使用 # 作为分隔符避免斜杠冲突)
sed 's#http://#https://#g' api.conf
# 正则捕获组反向引用:将形如 key = value 转换为 key: value
sed 's/^\([a-zA-Z0-9_]\+\) = \(.*\)/\1: \2/' config.ini2. 生产环境安全法则:强制自动备份(-i.bak)
在直接修改生产配置文件时,绝不要裸用 sed -i。加上后缀参数可以让 Sed 在写入新文件前自动生成备份源文件:
bash
# 在修改 nginx.conf 的同时自动生成 nginx.conf.bak 备份
sed -i.bak 's/worker_processes 1;/worker_processes auto;/g' /etc/nginx/nginx.conf
# 若修改出现偏差,可直接一条命令秒级回滚:
# mv /etc/nginx/nginx.conf.bak /etc/nginx/nginx.conf