前言

日常运维中,经常需要分析日志、筛选内容、批量修改文本、格式化输出数据,纯手动编辑效率极低。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. 核心概念

  1. 字段:awk 默认以空格 / 制表符作为分隔符,把每行文本切分为多个字段
    • $0:代表整行内容
    • $1:第一个字段
    • $2:第二个字段
    • $n:第 n 个字段
  2. 内置变量
    • 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}'

五、三剑客分工总结(快速区分)

  1. grep:主打检索、过滤,只找符合条件的内容,不做复杂修改和计算
  2. sed:主打行编辑,批量增删改行、字符替换,适合处理整行内容
  3. awk:主打字段分割、数据提取、格式化、简单统计,适合结构化文本

本篇小结

  1. grep 搭配参数和管道,是日志、进程、文件内容检索的首选工具。
  2. sed 重点掌握替换、删除、插入三大动作,-i 参数修改原文件需谨慎。
  3. awk 核心理解字段 $1/$2、行号 NR、分隔符 -F,擅长拆分结构化文本。
  4. 实际工作中常将三者组合使用,完成复杂的文本处理需求。

下期预告

下一篇我们学习 Vim 编辑器深度使用,从基础模式到常用编辑命令、简易配置,熟练掌握终端下的文本编辑利器。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐