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 -nr

awk 自带统计(不用 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"
done

2)提取日志中某个时间段的错误

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 -nr

4)找出访问最多的 10 个页面

awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -10

5)批量重命名

for f in *.jpg; do
    mv "$f" "$(echo $f | sed 's/ /_/g')"
done

6)把 CSV 转成 SQL

awk -F, '{printf "INSERT INTO users (name, email) VALUES (\"%s\", \"%s\");\n", $1, $2}' users.csv

7)提取配置文件的某个值

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' file

2)正则特殊字符要转义

. * [ ] ^ $ \ + ? ( ) { } |

在 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 日志分析实战》
延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:Git 版本控制与服务器部署:代码管理 + 一键上线
  2. 下一篇:MySQL / MariaDB 安装与优化入门:让数据库跑得动
发表评论 1