13
10
月
2026
服务器上经常要做这些事:批量替换配置文件里的某个值、从日志里提取特定字段、统计访问量、格式化输出。
这些用 sed(流编辑器)和 awk(文本分析工具)几秒就能搞定,比打开编辑器手动改快得多,还能写进脚本自动化。
需要一台服务器练手?财富云计算 提供云服务器;内网服务、测试环境可选 NAT 型(无独立公网 IP,价格比带独立 IP 机型省一半以上)。
一、sed:批量编辑
基本用法
sed 's/旧/新/' file # 替换每行第一个匹配(输出到屏幕,不改文件)
sed 's/旧/新/g' file # 替换每行所有匹配
sed -i 's/旧/新/g' file # ⚠️ 直接修改文件
sed -i.bak 's/旧/新/g' file # 修改并备份原文件为 file.bak(推荐)实战例子
批量替换配置里的域名:
sed -i 's/old.com/new.com/g' /etc/nginx/sites-available/mysite
nginx -t && systemctl reload nginx批量改代码里的 IP:
sed -i 's/192\.168\.1\.100/10.0.0.5/g' config/*.conf
# 注意:sed 里 . 需要转义 \.注释掉某行:
sed -i 's/^option_x/#option_x/' file.conf
# ^ 表示行首取消注释:
sed -i 's/^#option_x/option_x/' file.conf删除包含某关键词的行:
sed -i '/关键词/d' file
sed -i '/^$/d' file # 删除空行
sed -i '/^#/d' file # 删除注释行在特定行前后插入:
sed -i '10i 这是新的一行' file # 第 10 行前插入
sed -i '10a 这是新的一行' file # 第 10 行后插入
sed -i '/关键词/i 新行' file # 匹配行前插入
sed -i '$a 追加到文件末尾' file # 末尾追加替换指定行:
sed -i '5s/.*/这是第5行的新内容/' file
sed -i '1,10s/旧/新/g' file # 只替换 1-10 行多个操作:
sed -i -e 's/a/b/g' -e 's/c/d/g' file分隔符问题
替换内容里有 / 时(比如路径),要换分隔符:
# 错误
sed -i 's/path/to/path2/to/g' file
# 正确:用 | 或 # 做分隔符
sed -i 's|path/to|path2/to|g' file
sed -i 's#path/to#path2/to#g' file配合变量
OLD="old.com"
NEW="new.com"
sed -i "s/$OLD/$NEW/g" file # 注意用双引号安全提示
# 先预览
sed 's/旧/新/g' file | head
# 确认无误再改
sed -i.bak 's/旧/新/g' file二、awk:文本分析
awk 按行处理,把每行按分隔符切成字段($1、$2...),非常适合处理有结构的文本(日志、CSV)。
基本语法
awk '模式 {动作}' file
awk '{print $1}' file # 打印第 1 列
awk '{print $1, $3}' file # 打印第 1、3 列
awk -F: '{print $1}' /etc/passwd # 指定分隔符为冒号| 变量 | 含义 |
|---|---|
$0 | 整行 |
$1 $2 ... | 第 1、2 个字段 |
$NF | 最后一个字段 |
NR | 当前行号 |
NF | 当前行的字段数 |
FS | 输入分隔符(可用 -F 指定) |
OFS | 输出分隔符 |
实战例子
取进程 PID:
ps aux | grep nginx | awk '{print $2}'取 IP 地址:
ip a | grep "inet " | awk '{print $2}' | cut -d/ -f1看磁盘使用率(只要数字):
df -h | awk '{print $5}' | sed 's/%//'统计日志里每个 IP 的访问次数:
awk '{print $1}' access.log | sort | uniq -c | sort -nrawk 自带统计(不用 sort/uniq):
awk '{count[$1]++} END {for (ip in count) print count[ip], ip}' access.log | sort -rn | head按条件过滤:
# 只显示状态码为 500 的行
awk '$9 == 500 {print $0}' access.log
# 只显示响应大于 1MB 的请求
awk '$10 > 1048576 {print $7, $10}' access.log
# 显示第 10 行到第 20 行
awk 'NR >= 10 && NR <= 20' file求和与平均:
# 求总流量(第 10 列是字节数)
awk '{sum += $10} END {print sum/1048576 " MB"}' access.log
# 求平均响应时间(假设最后一列是 rt=0.123)
awk -F'rt=' '{sum += $2; n++} END {print "平均: " sum/n "s"}' access.log格式化输出:
# 类似表格输出
ps aux | awk 'NR>1 {printf "%-10s %-6s %-6s %s\n", $1, $3, $4, $11}'BEGIN / END 块:
awk 'BEGIN {print "开始统计"; sum=0}
{sum += $1}
END {print "总计:", sum}' file多分隔符:
# 同时用空格和冒号分隔
awk -F'[ :]' '{print $1, $2}' file内置函数
awk '{print length($0)}' file # 行长度
awk '{print toupper($1)}' file # 转大写
awk '{print substr($1, 1, 3)}' file # 截取
awk '{gsub(/old/, "new"); print}' file # 替换(类似 sed)
awk '{print $1, $NF}' file # 第一列和最后一列三、两者配合的经典用法
1)批量修改多个文件
for f in /etc/nginx/sites-available/*; do
sed -i 's/old.com/new.com/g' "$f"
done2)提取日志中某个时间段的错误
sed -n '/13\/Oct\/2026:02:00/,/13\/Oct\/2026:03:00/p' access.log | awk '$9 >= 500'3)统计每个状态的连接数
ss -ant | awk 'NR>1 {print $1}' | sort | uniq -c | sort -nr4)找出访问最多的 10 个页面
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -105)批量重命名
for f in *.jpg; do
mv "$f" "$(echo $f | sed 's/ /_/g')"
done6)把 CSV 转成 SQL
awk -F, '{printf "INSERT INTO users (name, email) VALUES (\"%s\", \"%s\");\n", $1, $2}' users.csv7)提取配置文件的某个值
grep "^max_connections" /etc/mysql/my.cnf | awk -F'=' '{print $2}' | tr -d ' '8)监控日志并高亮
tail -f app.log | awk '/ERROR/ {print "\033[31m" $0 "\033[0m"; next} {print}'四、实际运维场景
场景 1:批量改 Nginx 端口
# 所有站点配置里 80 改成 8080
sed -i 's/listen 80;/listen 8080;/' /etc/nginx/sites-available/*
nginx -t && systemctl reload nginx场景 2:清理日志里的敏感信息
sed -i 's/password=[^&]*/password=***/g' access.log场景 3:统计磁盘占用 Top
du -sh /* 2>/dev/null | sort -rh | head -10
# 或
du -sk * | sort -rn | awk '{printf "%.2f MB\t%s\n", $1/1024, $2}' | head场景 4:找出占用端口的 PID
ss -tulnp | grep :80 | awk -F'pid=' '{print $2}' | awk -F',' '{print $1}'场景 5:批量提取配置
# 从 php.ini 里提取所有 memory_limit 相关配置
grep -n "memory_limit" /etc/php/8.2/fpm/php.ini | awk -F: '{print "第" $1 "行: " $2}'场景 6:分析慢请求
awk -F'rt=' '$2 > 1 {print $0}' access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head五、注意事项
1)sed -i 是危险的
# 一定要先备份或先预览
sed -i.bak 's/旧/新/g' file # 推荐:自动生成 .bak
# 或
cp file file.bak && sed -i 's/旧/新/g' file2)正则特殊字符要转义
. * [ ] ^ $ \ + ? ( ) { } |在 sed 的匹配部分需要转义:
sed -i 's/192\.168\.1\.1/10.0.0.1/g' file(替换部分不需要转义)
3)awk 字段编号从 1 开始
$0 是整行,$1 是第一个字段。
4)默认分隔符是"任意空白"
多个空格会被当作一个分隔符(这点和 cut 不同,cut 只能单字符分隔)。
echo "a b" | awk '{print $2}' # b ✓
echo "a b" | cut -d' ' -f2 # 空 ✗5)引号嵌套
awk '{print "hello"}' # 外层单引号,内层双引号
awk "{print \"hello\"}" # 不推荐,容易乱在脚本里用变量时要注意:
# 脚本里
THRESHOLD=85
awk -v t=$THRESHOLD '$5+0 > t {print}' file # 用 -v 传变量(推荐)六、速查表
sed
sed 's/旧/新/g' file 预览替换
sed -i 's/旧/新/g' file 直接替换
sed -i.bak 's/旧/新/g' file 替换并备份
sed -n '10,20p' file 只看 10-20 行
sed '/关键词/d' file 删除匹配行
sed -i 's|/old/path|/new/path|g' f 路径替换用 | 分隔
sed -i 's/^/#/' file 全部行加注释
sed -i 's/^#//' file 去掉注释
sed -i '$a 新行' file 末尾追加awk
awk '{print $1}' file 第 1 列
awk -F: '{print $1}' /etc/passwd 指定分隔符
awk 'NR==5' file 第 5 行
awk 'NR>=10 && NR<=20' file 10-20 行
awk '$3 > 100 {print}' file 条件过滤
awk '{sum+=$1} END {print sum}' f 求和
awk '{c[$1]++} END {for(i in c) print c[i], i}' f 统计频次
awk '{print $NF}' file 最后一列
awk 'BEGIN{FS=":";OFS="-"}{print $1,$2}' file 设输入输出分隔符
awk -v t=85 '$5+0 > t' file 传变量七、什么时候用哪个
| 需求 | 工具 |
|---|---|
| 替换文本 | sed |
| 删除/插入行 | sed |
| 提取某一列 | awk(或 cut) |
| 按条件过滤 | awk |
| 统计、求和 | awk |
| 格式化输出 | awk |
| 复杂文本处理 | awk |
一句话区分:sed 改文本,awk 分析文本。
sed 和 awk 是 Shell 脚本的核心能力,练熟能省大量时间。财富云计算 的云服务器提供完整命令行环境,可自由练习与部署脚本;内网服务、测试环境可选 NAT 型(无独立公网 IP,价格比带独立 IP 机型省一半以上)。
相关阅读:
- 《Shell 脚本编写入门》
- 《Linux 常用命令速查表》
- 《Web 日志分析实战》
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-18 回复