前言
Linux 中的 sed
、awk
和 grep
常被称为“文本处理三剑客”,它们在处理文本数据时各有侧重,但又能协同工作。以下是它们的核心差异和联系:
一、核心定位
-
grep
- 定位:行过滤器
- 核心功能:快速过滤出匹配模式的行(正则表达式)。
- 典型场景:查找日志中的错误关键词、筛选配置文件中的特定段落。
- 示例:
grep "ERROR" server.log
-
sed
- 定位:流式文本编辑器
- 核心功能:按行处理文本,支持替换、删除、插入等操作(基于正则表达式)。
- 典型场景:批量替换文件内容、删除空白行、格式化文本。
- 示例:
sed 's/foo/bar/g' file.txt
-
awk
- 定位:结构化文本处理器
- 核心功能:按列(字段)处理文本,支持编程逻辑(变量、循环、条件判断)。
- 典型场景:统计日志数据、生成报表、提取复杂格式的字段。
- 示例:
awk '{sum += $1} END {print sum}' data.txt
二、核心差异
工具 | 处理单位 | 编程能力 | 正则支持 | 典型用途 |
---|---|---|---|---|
grep | 行 | 无 | 支持 | 过滤行 |
sed | 行 | 简单命令 | 支持 | 行级编辑(替换、删除等) |
awk | 列+行 | 完整的脚本语言 | 支持 | 列计算、复杂逻辑处理 |
三、联系与协作
-
正则表达式
三者均支持正则表达式,但awk
和sed
的语法略有差异(例如\d
在awk
中需写成[0-9]
)。 -
管道协作
通过管道(|
)组合使用,例如:# 1. 用 grep 过滤出包含 "GET" 的行 # 2. 用 sed 删除行首的时间戳 # 3. 用 awk 统计第3列的均值 grep "GET" access.log | sed 's/^\[.*\] //' | awk '{sum += $3} END {print sum/NR}'
-
互补性
grep
快速过滤后,可用sed
编辑,再用awk
分析。awk
内置grep
功能(通过~
匹配),也可替代部分sed
操作。
四、典型场景对比
-
替换文本
sed
:sed 's/old/new/g'
(简单高效)awk
:awk '{gsub(/old/, "new"); print}'
(适合条件替换,如仅替换第2列)
-
提取字段
awk
:awk -F',' '{print $2}' data.csv
(按逗号分隔提取第2列)sed
:需依赖正则表达式分组(复杂场景不推荐)
-
条件过滤
grep
:grep "error" file.log
(直接过滤行)awk
:awk '/error/ && $1 > 100' file.log
(多条件组合)
五、如何选择?
- 简单过滤行 →
grep
- 行级编辑(替换/删除) →
sed
- 列处理、复杂逻辑 →
awk
- 组合任务 → 管道串联(如
grep | sed | awk
)
总结
grep
是“找什么”,sed
是“改什么”,awk
是“算/分什么”。- 三者结合可实现从简单过滤到复杂数据处理的完整工作流。
- 学习优先级建议:
grep
→sed
→awk
(由易到难)。