一、三者核心区别
| 工具 | 定位 | 主要用途 | 处理单位 |
|---|
| grep | 过滤/搜索 | 快速匹配文本模式 | 行 |
| sed | 流编辑器 | 替换、删除、插入、修改 | 行(可逐行编辑) |
| awk | 报告生成器 | 复杂的格式化、统计、计算 | 字段(列) |
简单记忆:
- grep = 找东西
- sed = 改东西(非交互式)
- awk = 算东西(列操作、统计)
二、grep – 强大的文本搜索
基本语法
grep [选项] '模式' 文件名
常用选项
| 选项 | 说明 |
|---|
-i | 忽略大小写 |
-v | 反向匹配(不包含模式的行) |
-n | 显示行号 |
-r / -R | 递归搜索目录 |
-E | 使用扩展正则(egrep) |
-l | 只显示匹配的文件名 |
-c | 只统计匹配的行数 |
示例
grep 'error' /var/log/syslog
grep -r 'Listen' /etc/ --include='*.conf'
grep -v '^#' /etc/nginx/nginx.conf
grep '\bin\b' file.txt
grep -E 'error|warning' log.txt
三、sed – 流编辑器(非交互式)
基本语法
sed [选项] '命令' 文件名
常用命令
| 命令 | 说明 |
|---|
s/old/new/ | 替换(默认只替换每行第一个) |
s/old/new/g | 全局替换 |
d | 删除行 |
p | 打印行(常与 -n 配合) |
a | 追加文本 |
i | 插入文本 |
c | 替换整行 |
示例
sed 's/old/new/' file.txt
sed -i 's/old/new/g' file.txt
sed '/^$/d' file.txt
sed '2,5d' file.txt
sed -n '10p' file.txt
sed '/pattern/a\新增内容' file.txt
echo "hello 123 world" | sed 's/[0-9]\+/(&)/'
替换分隔符
可以用 |、# 等避免转义路径:
sed 's#/旧路径#/新路径#g' file.txt
四、awk – 文本处理语言
基本语法
awk '条件 {动作}' 文件名
内置变量
| 变量 | 含义 |
|---|
$0 | 整行内容 |
$1, $2... | 第1列、第2列... |
NF | 当前行的字段数 |
NR | 当前行号 |
FS | 输入字段分隔符(默认空格/tab) |
OFS | 输出字段分隔符 |
RS | 输入行分隔符(默认换行) |
示例
awk '{print $1, $3}' file.txt
awk -F':' '{print $1, $6}' /etc/passwd
awk '{print NR, $0}' file.txt
awk '{sum += $3} END {print "总和:", sum}' data.txt
awk '$2 > 100' file.txt
awk '{printf "%-10s %5d\n", $1, $2}' file.txt
awk '/error/ {print NR, $0}' log.txt
awk '{print int($1), length($2)}' file.txt
awk 脚本结构
awk 'BEGIN {初始化} 主体处理 {动作} END {收尾}' file
五、实际组合使用案例
1. 从日志中提取特定时间段的错误IP
grep '2025-05-20' app.log | grep 'ERROR' | awk '{print $1}' | sort | uniq -c
2. 替换文本中的多个模式
sed -e 's/foo/bar/g' -e 's/hello/hi/g' file.txt
3. 用 awk 代替 grep + cut
ps aux | grep nginx | awk '{print $2}'
ps aux | awk '/nginx/ {print $2}'
4. 修改 CSV 文件并重新格式化
awk -F',' 'BEGIN{OFS="|"} {print $1, $3, $5}' data.csv
5. 查找某目录下包含特定模式的文件名
ls -l | awk '$9 ~ /\.log$/ {print $9}'
ls -l | sed -n '/\.log$/p'
六、选型建议
| 场景 | 推荐工具 |
|---|
| 只想快速看日志里有没有 “error” | grep |
| 需要批量替换文件中的某个词 | sed -i |
| 按列统计、计算、格式化输出 | awk |
| 多行匹配或上下文(前后几行) | grep -A 3 -B 2 或 awk |
| 跨文件批量修改 | sed + find |
| 处理 JSON / XML / 复杂结构 | 建议用 jq 或 Python |
三者的正则语法略有差异:
- grep 默认基础正则,
-E 启用扩展
- sed 默认基础正则,
-r 或 -E 启用扩展
- awk 默认扩展正则