grep vs awk vs sed:文本处理三剑客怎么选?
grep 搜索匹配行,sed 替换编辑文本,awk 按列处理结构化数据
对比总览
| 维度 | grep | sed | awk |
|---|---|---|---|
| 核心用途 | 搜索匹配行 | 流式编辑/替换文本 | 按列处理结构化数据 |
| 输入处理 | 逐行匹配正则 | 逐行应用编辑命令 | 按分隔符拆分为字段 |
| 输出 | 匹配的行 | 编辑后的全部文本 | 自定义格式输出 |
| 学习曲线 | 低,几个参数就够用 | 中,替换语法需要练习 | 高,本身是编程语言 |
| 典型场景 | 在日志中找错误 | 批量替换配置文件内容 | 从 CSV/日志中提取特定列 |
各自适用场景
grep
适合场景:
- 在文件中搜索包含某关键词的行
- 递归搜索代码库中的字符串
- 过滤管道输出中的特定内容
- 统计匹配行数
搜索错误日志
grep -i "error" /var/log/syslog
递归搜索代码
grep -rn "TODO" src/
反向过滤
ps aux | grep nginx | grep -v grep
sed
适合场景:
- 批量替换文件中的字符串
- 删除文件中的特定行
- 在特定位置插入文本
- 处理配置文件模板
替换字符串
sed -i 's/old/new/g' file.txt
删除空行
sed -i '/^$/d' file.txt
替换配置值
sed -i 's/port=8080/port=3000/' config.ini
awk
适合场景:
- 提取日志或 CSV 中的特定列
- 对数值列进行计算(求和、平均)
- 按条件格式化输出
- 处理有固定分隔符的结构化文本
提取第二列
awk '{print $2}' file.txt按分隔符提取
awk -F: '{print $1, $3}' /etc/passwd条件过滤+计算
awk '$3 > 100 {sum+=$3} END {print sum}' data.txt组合使用
grep + awk:找到错误并提取时间
grep "ERROR" app.log | awk '{print $1, $2, $NF}'先过滤再提取列
grep + sed:找到并替换
grep -rl "http://" src/ | xargs sed -i 's|http://|https://|g'
先找文件再批量替换
awk 做 grep 的事
awk '/error/{print}' log.txtawk 也能匹配,但 grep 更快
建议
日常使用建议:搜索用 grep(最快最简单),替换用 sed(一行搞定),提取列和计算用 awk。三者经常配合管道一起使用。