Shell 文本处理三剑客 — grep / sed / awk
grep、sed、awk 是 Linux Shell 文本处理的三大神器,合称”三剑客”:
| 剑客 | 定位 | 核心理念 |
|---|
| grep | 文本搜索 | 按模式匹配行 |
| sed | 文本编辑 | 流式编辑,逐行处理 |
| awk | 文本格式化 | 按列处理,编程语言级功能 |
grep — 搜索行
三种变体
| 命令 | 等同 | 正则能力 |
|---|
grep | grep -G | 基础正则(BRE) |
egrep | grep -E | 扩展正则(ERE) |
fgrep | grep -F | 固定字符串(不做正则解析) |
常用用法
grep -r "error" /var/log/ # 递归搜索
grep -i "warning" app.log # 忽略大小写
grep -v "^#" config.conf # 排除注释行
grep -c "ERROR" log.txt # 统计匹配行数
grep -n "exception" main.py # 显示行号
grep -l "TODO" src/*.py # 只显示文件名
BRE vs ERE 元字符对比
| 元字符 | BRE 中需转义? | ERE 中用法 |
|---|
? | \? | ?(前一个字符出现 0 或 1 次) |
+ | \+ | +(前一个字符出现 1 次以上) |
| ` | ` | | |
() | \( \) | ( )(分组) |
{} | \{n,m\} | {n,m}(重复次数) |
高效正则原则:锚定边界(^ $)、使用字符集合([0-9])、避免过度贪婪。
sed — 流编辑器
sed 是流式编辑器——一次读一行,处理完输出,不修改原文件(除非 -i)。
核心命令
| 命令 | 功能 |
|---|
p | 打印 |
d | 删除 |
s/old/new/ | 替换(第一个匹配) |
s/old/new/g | 替换(全局) |
a | 追加(后一行) |
i | 插入(前一行) |
c | 整行替换 |
常用用法
sed -n '5,10p' file.txt # 打印第 5-10 行(-n 取消默认输出)
sed -i 's/192.168.1/10.0.0/g' config # 全局替换并直接修改文件
sed '/^#/d' config.conf # 删除所有注释行
sed -r 's/[0-9]+/NUM/g' data.txt # -r 启用扩展正则
sed '3a\--- new line ---' file.txt # 在第 3 行后追加
模式空间与保持空间
| 命令 | 作用 |
|---|
h / H | 覆盖/追加到保持空间 |
g / G | 从保持空间取回/追加 |
x | 交换模式空间和保持空间 |
用于跨行操作场景(如调换文件段落顺序)。
awk — 列处理器
awk 被设计为数据驱动的编程语言——按列拆分,逐行处理,格式化输出。
核心概念
| 内建变量 | 含义 |
|---|
$0 | 整行 |
$1 ~ $n | 第 n 列 |
NF | 当前行的字段数 |
NR | 当前行号 |
FS / -F | 字段分隔符(默认空白) |
OFS | 输出字段分隔符 |
常用用法
awk '{print $1, $3}' access.log # 打印第 1、3 列
awk -F: '{print $1}' /etc/passwd # 以冒号分隔
awk '/error/{print NR, $0}' log.txt # 搜索 error 并显示行号+内容
awk '{sum+=$NF} END{print sum}' data # 统计最后一列的总和
awk 'NR>1{print $0}' data.csv # 跳过表头行
进阶用法
# 格式化输出
awk '{printf "%-10s %8d\n", $1, $2}' data
# 条件过滤
awk '$3 > 100 {print $1, $3}' scores.txt
# 关联数组统计
awk '{count[$1]++} END{for(k in count) print k, count[k]}' access.log
三剑客对比总结
| 维度 | grep | sed | awk |
|---|
| 处理单位 | 行 | 行 | 列 |
| 编程能力 | ❌ 匹配 | ⭐ 简单编辑 | ⭐⭐⭐ 完整语言 |
| 典型场景 | 搜索日志 | 替换配置 | 统计分析 |
| 正则支持 | ✅ | ✅ | ✅ |
| 直接改文件 | ❌ | ✅ -i | ❌(需重定向) |
组合技巧:grep 过滤 → sed 替换 → awk 格式化输出,三剑客管道串联实现复杂文本处理 pipeline。
相关页面