新手学 Linux 别死啃命令!第七篇:文本处理三剑客,grep/sed/awk 高效处理日志与文本
·
前言
日常运维中,经常需要分析日志、筛选内容、批量修改文本、格式化输出数据,纯手动编辑效率极低。Linux 中 grep、sed、awk 被称为文本处理三剑客,分工明确、功能强大,是日志排查、文本批量处理、数据提取的核心工具。
本篇结合基础用法、常用参数、实战案例讲解三大命令,从简单内容检索到复杂文本处理全覆盖,学完就能轻松搞定日志分析、批量改配置等工作。
一、grep 文本过滤查找
grep 核心作用:按关键词匹配、筛选文件内容,从文本 / 日志中快速找出符合条件的行,是使用频率最高的检索工具。
1. 基础语法
grep [参数] 匹配关键词 文件名
2. 常用参数详解
-i:忽略大小写进行匹配-n:显示匹配内容所在的行号-v:反向匹配,显示不包含关键词的所有行-o:只输出匹配到的关键词本身,不输出整行内容-c:只统计匹配到的行数,不展示具体内容-r/-R:递归检索目录下所有文件(排查项目日志、配置必备)-E:启用扩展正则表达式,等价于egrep
3. 基础实战示例
准备测试文件 test.txt,开始实操:
# 1. 查找文件中包含 linux 的行
grep "linux" test.txt
# 2. 忽略大小写查找,同时显示行号
grep -in "linux" test.txt
# 3. 反向过滤:找出不包含 linux 的行
grep -v "linux" test.txt
# 4. 统计包含关键词的总行数
grep -c "linux" test.txt
# 5. 递归查找 /home 目录下所有包含 root 的文件
grep -r "root" /home/
4. 结合管道联用(高频场景)
搭配之前学的管道 |,筛选其他命令的输出结果,运维最常用:
# 查看进程,过滤出 python 相关进程
ps aux | grep python
# 查看历史命令,过滤所有 find 相关操作
history | grep find
# 查看端口,过滤指定服务
netstat -an | grep 22
二、sed 流编辑器
sed 全称流编辑器,核心作用:批量编辑文本,支持增、删、改、替换操作,全程无需打开文件,适合批量修改配置、处理大文件。默认只输出处理结果,不直接修改原文件。
1. 基础语法
sed [参数] '动作' 文件名
2. 常用参数
-n:只输出被匹配 / 处理的行(静默模式)-i:直接修改原文件(生产环境谨慎使用,建议先备份)-e:执行多个编辑动作
3. 核心动作(增删改查)
(1)查询 p 打印
# 打印文件第 2 行内容
sed -n '2p' test.txt
# 打印 2~5 行内容
sed -n '2,5p' test.txt
# 匹配包含 linux 的行并打印
sed -n '/linux/p' test.txt
(2)删除 d 删除行
# 删除第 3 行,仅输出结果,不改动原文件
sed '3d' test.txt
# 删除 1~4 行
sed '1,4d' test.txt
# 删除所有包含 linux 的行
sed '/linux/d' test.txt
(3)替换 s 字符替换(最核心功能)
语法格式:s/原内容/新内容/修饰符常用修饰符:
g:全局替换(默认只替换每行第一个匹配项)i:忽略大小写
# 将每行第一个 linux 改为 ubuntu
sed 's/linux/ubuntu/' test.txt
# 全局替换,整行所有 linux 都改为 ubuntu
sed 's/linux/ubuntu/g' test.txt
# 直接修改原文件,全局替换
sed -i 's/linux/ubuntu/g' test.txt
(4)新增 a /i 插入内容
a:在匹配行下方追加内容i:在匹配行上方插入内容
# 在第 2 行下方追加一行文本
sed '2a 新增内容' test.txt
# 在包含 linux 的行上方插入文本
sed '/linux/i 插入内容' test.txt
4. 多动作联合执行
# 同时执行删除+替换操作
sed -e '3d' -e 's/linux/ubuntu/g' test.txt
三、awk 文本分析与格式化工具
awk 侧重文本分割、字段提取、数据统计、格式化输出,擅长处理有规律的结构化文本(如日志、配置、表格类内容),可以理解为简易的数据处理脚本工具。
1. 核心概念
- 字段:awk 默认以空格 / 制表符作为分隔符,把每行文本切分为多个字段
$0:代表整行内容$1:第一个字段$2:第二个字段$n:第 n 个字段
- 内置变量
NR:行号,记录当前处理的是第几行FS:自定义字段分隔符
2. 基础语法
awk '条件 {执行动作}' 文件名
3. 基础实操示例
# 1. 输出文件每行第一个字段
awk '{print $1}' test.txt
# 2. 输出第1、3个字段,中间用制表符分隔
awk '{print $1 "\t" $3}' test.txt
# 3. 输出整行内容(等价直接查看文件)
awk '{print $0}' test.txt
# 4. 输出行号 + 整行内容
awk '{print NR " " $0}' test.txt
4. 自定义分隔符
当文本不以空格分隔(如冒号、逗号),使用 -F 指定分隔符:
# 以冒号为分隔符,提取 /etc/passwd 的用户名(第一个字段)
awk -F: '{print $1}' /etc/passwd
# 以逗号作为分隔符
awk -F, '{print $2}' test.csv
5. 条件匹配用法
结合关键词、行号做筛选,精准提取数据:
# 只输出包含 root 的行的第一个字段
awk '/root/ {print $1}' /etc/passwd
# 只处理 2~6 行内容
awk 'NR>=2 && NR<=6 {print $0}' test.txt
6. 简单运算统计
awk 支持数值计算,可做简单求和、计数:
# 统计文件总行数
awk 'END{print NR}' test.txt
四、三剑客综合使用场景(企业实战)
场景 1:排查系统进程
# 筛选nginx进程,过滤无关grep自身进程
ps aux | grep nginx | grep -v grep
场景 2:批量修改配置文件
# 批量将配置中的 80 端口改为 8080,直接修改原文件
sed -i 's/80/8080/g' nginx.conf
场景 3:提取用户列表
# 从 /etc/passwd 提取所有用户名
awk -F: '{print $1}' /etc/passwd
场景 4:日志分析(经典组合)
# 从访问日志中筛选指定IP的请求,并提取访问路径
grep "192.168.1.100" access.log | awk '{print $7}'
五、三剑客分工总结(快速区分)
- grep:主打检索、过滤,只找符合条件的内容,不做复杂修改和计算
- sed:主打行编辑,批量增删改行、字符替换,适合处理整行内容
- awk:主打字段分割、数据提取、格式化、简单统计,适合结构化文本
本篇小结
grep搭配参数和管道,是日志、进程、文件内容检索的首选工具。sed重点掌握替换、删除、插入三大动作,-i参数修改原文件需谨慎。awk核心理解字段$1/$2、行号NR、分隔符-F,擅长拆分结构化文本。- 实际工作中常将三者组合使用,完成复杂的文本处理需求。
下期预告
下一篇我们学习 Vim 编辑器深度使用,从基础模式到常用编辑命令、简易配置,熟练掌握终端下的文本编辑利器。
更多推荐


所有评论(0)