在 Linux 系统中,grep、sed、awk被称为 “文本三剑客”,它们是处理文本数据的核心工具,在日志分析、数据清洗、批量处理等场景中不可或缺。三者分工明确又能协同作战:grep擅长搜索过滤,sed擅长流式编辑(替换、删除等),awk擅长格式化分析(按列处理、统计计算)。以下详细解析三者的功能、语法及实战案例。
一、 grep:文本搜索 “神器”
grep(Global Regular Expression Print)的核心功能是在文本中搜索符合正则表达式的内容,并输出匹配的行。它是三剑客中最常用的工具,尤其适合快速定位关键信息。
1. 基本语法
grep [选项] "模式" 文件名/目录
2. 核心选项
| 选项 | 功能 | 示例 |
| -i | 忽略大小写 | grep -i "error" app.log(匹配 Error/ERROR/error) |
| -n | 显示匹配行的行号 | grep -n "warning" sys.log(输出行号 + 内容) |
| -v | 反向匹配(输出不包含模式的行) | grep -v "debug" app.log(排除调试日志) |
| -r | 递归搜索目录下的所有文件 | grep -r "password" /etc/(搜索 /etc 下含 password 的文件) |
| -E | 用于支持扩展正则表达式 | grep -E "ERROR|WARN" app.log逻辑 “或”,匹配多个模式中的任意一个 |
| -o | 只输出匹配的内容(而非整行) | grep -o "[0-9]\+" data.txt(只提取数字) |
| -c | 统计匹配的行数 | grep -c "404" access.log(统计 404 错误的数量) |
3. 实战案例
-
案例 1:分析 Nginx 访问日志,统计包含 “404” 的行及行号
grep -n "404" /var/log/nginx/access.log
- 案例 2:从系统日志中排除 “INFO” 级别的记录,只看警告和错误
grep -v "INFO" /var/log/messages | grep -E "WARN|ERROR"
-
案例 3:递归搜索项目目录中所有包含 “TODO” 的代码文件
grep -r -n "TODO" ./project/
二、 sed:流式文本编辑工具
sed(Stream Editor)是一种非交互式的文本编辑器,它按行处理文本,通过 “模式空间”(临时缓冲区)对内容进行替换、删除、新增等操作,适合批量修改文本。
1. 基本语法
sed [选项] "操作命令" 文件名
- 选项:
-i(直接修改文件,不加则仅预览)、-n(仅输出处理后的行)。 - 操作命令:格式为
[地址范围]命令[参数](地址范围可省略,默认处理所有行)。
2. 核心命令
| 命令 | 功能 | 示例 |
| s/旧内容/新内容/ | 替换文本(默认只替换每行第一个匹配) | sed "s/old/new/" file.txt(替换 old 为 new) |
| s/旧内容/新内容/g | 全局替换(替换每行所有匹配) | sed "s/old/new/g" file.txt(全行替换 old) |
| d | 删除行 | sed "3d" file.txt(删除第 3 行);sed "/^#/d" file.txt(删除注释行,^# 表示以 #开头) |
| p | 打印行(常与-n配合) | sed -n "5p" file.txt(只打印第 5 行);sed -n "/error/p" file.txt(打印含 error 的行) |
| a\文本 | 在指定行后追加文本 | sed "3a\new line" file.txt(在第 3 行后加 new line) |
| i\文本 | 在指定行前插入文本 | sed "/hello/i\before" file.txt(在含 hello 的行前加 before) |
3. 实战案例
-
案例 1:批量替换配置文件中的旧 IP 为新 IP(直接修改文件)
sed -i "s/192.168.1.100/10.0.0.5/g" /etc/nginx/conf.d/*.conf
(将所有 Nginx 配置中的 192.168.1.100 替换为 10.0.0.5)
- 案例 2:删除日志文件中所有空行和注释行(# 开头)
sed -i "/^#/d; /^$/d" app.conf # 分号分隔两个命令:删除注释行和空行
- 案例 3:在所有
.sh脚本的第一行添加#!/bin/bash(若不存在)
sed -i "1i#!/bin/bash" *.sh # 在第1行前插入(若已存在会重复,可先用grep判断)
三、 awk:文本格式化与分析工具
awk是功能最强大的文本处理工具,它以 **“行” 为处理单位,以 “列” 为分析维度 **,支持变量、循环、条件判断等编程特性,适合处理结构化文本(如日志、CSV)。
1. 基本语法
awk [选项] '模式 {动作}' 文件名
- 默认分隔符:空格或制表符,可通过
-F指定(如-F,指定逗号为分隔符)。 - 核心变量:
$0(整行内容)、$n(第 n 列内容)、NF(当前行的列数)、NR(当前行号)。
2. 常用功能与示例
| 功能 | 示例 | 说明 |
| 按列提取内容 | awk '{print $1, $3}' data.txt | 打印每行第 1 列和第 3 列 |
| 指定分隔符 | awk -F ',' '{print $2}' info.csv | 以逗号分隔,打印第 2 列(处理 CSV 文件) |
| 条件过滤 | awk '$3 > 100 {print $1, $3}' score.txt | 第 3 列(分数)>100 时,打印第 1 列(姓名)和第 3 列 |
| 统计计算 | awk '{sum += $2} END {print "总和:", sum}' sales.txt | 计算第 2 列的总和(END 在所有行处理完后执行) |
| 行号处理 | awk 'NR == 5 {print $0}' file.txt | 打印第 5 行整行内容 |
| 字符串匹配 | awk '$1 ~ /^root/ {print $0}' /etc/passwd | 第 1 列以 root 开头的行(~ 表示匹配正则) |
3. 实战案例
-
案例 1:分析 Nginx 访问日志,提取所有访问 IP 并统计出现次数(日志格式:IP 时间 ...)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
-
解析:
awk '{print $1}':提取第 1 列(IP);sort:排序 IP(便于去重);uniq -c:去重并计数;sort -nr:按计数倒序排列;head -n 10:取前 10 个(访问量最高的 IP)。
-
案例 2:处理 CSV 文件(姓名,年龄,城市),筛选年龄 > 30 且城市为 “北京” 的记录
awk -F ',' '$2 > 30 && $3 == "北京" {print $1, "年龄:"$2}' user.csv
- 案例 3:计算服务器 CPU 使用率(从 top 命令结果中提取)
top -b -n 1 | awk '/%Cpu/ {print "CPU使用率:", 100 - $8 "%"}'
-
解析:
top -b -n 1非交互式输出一次;%Cpu行中,$8是空闲率,100 - 空闲率即使用率。
四、 三剑客协同作战:组合使用案例
实际场景中,三者常通过管道(|)组合,发挥 1+1+1>3 的效果。
案例:分析 Web 服务器日志,统计 “POST” 请求中状态码为 500 的 URL 及出现次数
日志格式示例:10.0.0.1 - [10/Oct/2023:12:00:00] "POST /api/submit HTTP/1.1" 500 1234需求:提取 POST 请求中状态码为 500 的 URL,统计每个 URL 出现的次数。
# 步骤拆解:
# 1. grep筛选包含"POST"的行;
# 2. awk提取URL(第7列)和状态码(第9列),筛选状态码=500的URL;
# 3. sort+uniq统计次数,按次数倒序。
grep "POST" /var/log/nginx/access.log |
awk '$9 == 500 {print $7}' |
sort | uniq -c | sort -nr
五、 总结:三剑客的核心差异与适用场景
| 工具 | 核心优势 | 典型场景 | 一句话记忆 |
| grep | 搜索过滤(正则匹配) | 日志中找关键信息、筛选特定行 | 找得到 |
| sed | 流式编辑(替换、删除、新增) | 批量修改配置文件、清理文本 | 改得快 |
| awk | 格式化分析(按列处理、统计计算) | 结构化数据提取、数值计算 | 算得准 |
掌握这三个工具,能轻松应对 90% 以上的文本处理需求,尤其在服务器运维、日志分析、数据预处理等场景中,效率远超图形界面工具。
7614

被折叠的 条评论
为什么被折叠?



