sed负责行级清洗,awk负责字段级分析,二者通过管道自然衔接:sed先做轻量预处理(删注释、空行、标准化空白),再由awk专注结构化处理(提取列、统计、格式转换)。

sed 和 awk 各有分工,联合使用不是“拼在一起用”,而是按需分层处理:sed 负责行级清洗(如删空行、标准化格式、预处理结构),awk 负责字段级分析(如提取列、计算统计、条件过滤)。二者通过管道 | 自然衔接,无需额外胶水代码。
先用 sed 做轻量预处理
很多原始文本存在干扰格式(多余空格、注释行、标题头、不规则换行),直接喂给 awk 容易出错。sed 适合在前段做“减法”:
- 删掉以
#开头的注释行:sed '/^#/d' - 合并连续空行,只保留一个:
sed '/^$/N;/\n$/D' - 把多空格/制表符统一替换成单个空格,便于 awk 按空白分字段:
sed 's/[[:space:]]\+/ /g;s/^ //;s/ $//' - 去掉行首行尾空白:
sed 's/^[[:space:]]*//;s/[[:space:]]*$//'
再用 awk 做结构化处理
经过 sed 清洗后,文本更规整,awk 就能专注字段逻辑。常见组合模式:
- 提取特定列并加条件过滤:
sed '/^#/d' file.txt | awk '$3 > 100 {print $1, $2}'(跳过注释,只输出第3列大于100的第1、2列) - 统计某字段出现次数:
sed 's/^[[:space:]]*//;s/[[:space:]]*$//' log.txt | awk '{count[$5]++} END {for (k in count) print k, count[k]}' - 格式转换(如 CSV → 美观对齐):
sed 's/,/ /g' data.csv | awk '{printf "%-12s %-8s %s\n", $1, $2, $3}'
注意执行顺序与默认行为
管道中命令从左到右依次执行,前一个的 stdout 是后一个的 stdin。关键细节要留意:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- sed 默认输出所有行,若只想输出处理结果,避免冗余内容,加
-n并配合p命令(如sed -n '/error/p') - awk 默认以空白(空格、制表符等)为分隔符,若源数据是制表符或冒号分隔,要用
-F显式指定,例如awk -F':' '$7 ~ /bash$/ {print $1}' /etc/passwd - sed 的
-i会修改原文件,不能用于管道中间;所有管道操作都是流式、不落地的,安全可逆
一个完整实战例子
假设有个日志片段 access.log,含 IP、时间、URL、状态码,但混有注释和空行,想统计 4xx 错误最多的前3个 IP:
sed '/^#/d; /^$/d' access.log | awk '{if ($9 >= 400 && $9
这里 sed 先剔除干扰,awk 提取 IP 并计数,后续用 sort 和 head 完成排序截取——三者协同,各司其职。










