Shell 文本处理三剑客 — grep / sed / awk

grep、sed、awk 是 Linux Shell 文本处理的三大神器,合称”三剑客”:

剑客定位核心理念
grep文本搜索按模式匹配行
sed文本编辑流式编辑,逐行处理
awk文本格式化按列处理,编程语言级功能

grep — 搜索行

三种变体

命令等同正则能力
grepgrep -G基础正则(BRE)
egrepgrep -E扩展正则(ERE)
fgrepgrep -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

三剑客对比总结

维度grepsedawk
处理单位
编程能力❌ 匹配⭐ 简单编辑⭐⭐⭐ 完整语言
典型场景搜索日志替换配置统计分析
正则支持
直接改文件-i❌(需重定向)

组合技巧grep 过滤 → sed 替换 → awk 格式化输出,三剑客管道串联实现复杂文本处理 pipeline。

相关页面