sed
和 awk
是 Linux 中两个强大的文本处理工具,虽然它们都用于处理文本数据,但设计目标和适用场景有显著区别。以下是它们的核心区别和典型用法:
sed
(Stream Editor)
专注于流式文本编辑,主要用于简单的文本替换、删除、插入和打印。
优势:适合对文本进行快速、逐行、基于正则的修改(尤其是替换操作)。
awk
(以创始人 Aho, Weinberger, Kernighan 命名)
是一个完整的文本处理编程语言,擅长基于字段(列)的处理、计算和报表生成。
优势:处理结构化文本(如 CSV、日志)时,能轻松操作列数据、进行数学运算和逻辑判断。
特性 | sed |
awk |
---|---|---|
文本修改 | 强项(替换 s/old/new/ 、删除行) |
支持,但不如 sed 简洁 |
字段处理 | 弱(需复杂正则) | 强(自动按分隔符分列,$1,$2 …) |
数学运算 | 不支持 | 支持(变量、数组、算术/逻辑运算) |
条件逻辑 | 有限(仅地址匹配) | 完整(if/else/for/while ) |
输出控制 | 基础(如 p 打印) |
灵活(可格式化输出、自定义表头) |
多行处理 | 困难 | 相对容易(支持记录分隔符 RS ) |
sed
的常见场景# 替换文件中所有 "foo" 为 "bar"(全局替换)
sed 's/foo/bar/g' file.txt
# 删除空行
sed '/^$/d' file.txt
# 仅对第 2~4 行替换
sed '2,4s/old/new/' file.txt
# 直接修改原文件(-i 选项)
sed -i 's/pattern/replace/' file.txt
awk
的常见场景# 打印文件的第1列和第3列(默认以空格/制表符分列)
awk '{print $1, $3}' file.txt
# 对第3列求和
awk '{sum += $3} END {print sum}' file.txt
# 根据条件过滤行(如第2列大于100的行)
awk '$2 > 100 {print $0}' data.csv
# 自定义输入分隔符(如处理CSV)
awk -F',' '{print $2}' data.csv
# 复杂逻辑(如添加表头)
awk 'BEGIN {print "Name\tAge"} {print $1, $2}' file.txt
用 sed
如果:
用 awk
如果:
|
)结合二者,例如先用 sed
清理数据,再用 awk
分析。awk
通常比 sed
更高效(尤其是涉及字段操作时)。sed
语法更简单,awk
需要学习其脚本语法但功能更强大。sed
= 文本编辑器(适合快速修改)。awk
= 微型编程语言(适合数据处理和报表)。根据任务复杂度选择工具,或组合二者发挥最大威力!