在 Linux 系统中,grep
、sed
和 awk
被合称为「文本处理三剑客」,它们各自拥有独特的定位和功能,但又能通过管道协作实现复杂的文本处理任务。本文将深入解析它们的核心功能、差异、典型场景及组合使用技巧。
一、差异与适用场景
工具 | 处理单位 | 编程能力 | 典型用途 |
---|---|---|---|
grep | 行 | 无 | 快速过滤行 |
sed | 行 | 简单命令 | 行级编辑(替换、删除等) |
awk | 列+行 | 完整脚本语言 | 列计算、复杂逻辑处理 |
选择建议:
- 简单过滤行 →
grep
; - 行级编辑 →
sed
; - 列处理、复杂逻辑 →
awk
; - 组合任务 → 管道串联(如
grep | sed | awk
)
二、核心定位与功能对比
1. grep:行过滤器
- 核心功能:快速过滤匹配特定模式的行,支持正则表达式。
- 快速开始:
-
#搜索当前目录下文件中包含search-word的行 grep "search-word" .
-
#递归搜索特定目录下包含search-word的行 grep -r "search-word" /path/to/directory
-
- 常用参数:
-i
(忽略大小写)、-v
(反向匹配)、-n
(显示行号)、-r
(递归搜索目录)
2. sed:流式文本编辑器
- 核心功能:逐行处理文本,支持替换、删除、插入等操作。
- 快速开始:
-
sed 's/cat/dog/g' text.txt
将文件
text.txt
中所有的cat “” 替换为 “dog”,这里的/g
表示global全局替换, -
sed 's/cat/dog/' text.txt
省略
/g
,只会替换每一行中第一个出现的 “cat”
-
- 常用参数:
s
(替换)、d
(删除行)、a
(追加行)、i
(插入行)-i
(直接修改源文件,慎用)
3. awk:结构化文本处理器
- 核心功能:
awk
默认以空白字符(空格或制表)符作为字段分隔符 - 快速开始:创建 user.txt
//user.txt name age email John 30 john@example.com Alice 25 alice.work@example.com alice.personal@gmail.com Bob 35 bob123@yahoo.com Charlie 28 charlie.work@company.com Charlie 28 charlie.home@service.com Charlie 28 charlie.other@domain.net David 40 david.email@host.com
- 字段处理:
# run awk '{print $2,$1}' user.txt #output age name 30 John 25 Alice 35 Bob 28 Charlie 28 Charlie 28 Charlie 40 David
- 条件处理:
# run 筛选条件:age大于30 awk '$2 > 30' user.txt # output name age email #a的ASCII大于30 Bob 35 bob123@yahoo.com David 40 david.email@host.com
- 格式化输出
# run awk '{printf "%s %.2f\n", $1,$2}' user.txt #output name 0.00 John 30.00 Alice 25.00 Bob 35.00 Charlie 28.00 Charlie 28.00 Charlie 28.00 David 40.00
- NR参数
刚刚的输出,观察到也会格式化第一条,加入行号条件判断 awk '{if (NR == 1) print $1, $2; else printf "%s %.2f\n", $1, $2}' user.txt # output name age John 30.00 Alice 25.00 Bob 35.00 Charlie 28.00 Charlie 28.00 Charlie 28.00 David 40.00 反馈行号 awk '{print NR, $0}' user.txt # output 1 name age email 2 John 30 john@example.com 3 Alice 25 alice.work@example.com alice.personal@gmail.com 4 Bob 35 bob123@yahoo.com 5 Charlie 28 charlie.work@company.com 6 Charlie 28 charlie.home@service.com 7 Charlie 28 charlie.other@domain.net 8 David 40 david.email@host.com
- 字段处理:
- 核心变量:
$0
(整行)、$1, $2...
(第1、2列)、NF
(列数)、NR
(当前行号)
三、协作技巧
1. 正则表达式协作
三者均支持正则表达式,但语法略有差异:
grep
和sed
使用基础正则表达式;awk
需使用扩展正则表达式(如\d
需写成[0-9]
)
2. 管道串联示例
提取 IP 地址并统计出现次数
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
3. 互补性操作
awk
内置grep
功能(通过~
匹配),可替代部分sed
操作sed
适合简单替换,而awk
支持条件替换(如仅修改第二列)
四、总结与学习建议
- 总结:
grep
是「找什么」,sed
是「改什么」,awk
是「分什么」 - 学习优先级:
建议从grep
入门,逐步掌握sed
,最后挑战awk
掌握这三剑客的组合使用,能让你在 Linux 环境下的文本处理效率大大提升。无论是日志分析、数据清洗还是自动化脚本编写,它们都是不可或缺的利器。