grep vs awk vs sed:文本处理三剑客怎么选?

grep 搜索匹配行,sed 替换编辑文本,awk 按列处理结构化数据

对比总览

维度grepsedawk
核心用途 搜索匹配行 流式编辑/替换文本 按列处理结构化数据
输入处理 逐行匹配正则 逐行应用编辑命令 按分隔符拆分为字段
输出 匹配的行 编辑后的全部文本 自定义格式输出
学习曲线 低,几个参数就够用 中,替换语法需要练习 高,本身是编程语言
典型场景 在日志中找错误 批量替换配置文件内容 从 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.txt
awk 也能匹配,但 grep 更快

建议

日常使用建议:搜索用 grep(最快最简单),替换用 sed(一行搞定),提取列和计算用 awk。三者经常配合管道一起使用。