Linux文本三剑客:grep、sed、awk实战指南

在 Linux 系统中,grepsedawk被称为 “文本三剑客”,它们是处理文本数据的核心工具,在日志分析、数据清洗、批量处理等场景中不可或缺。三者分工明确又能协同作战: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% 以上的文本处理需求,尤其在服务器运维、日志分析、数据预处理等场景中,效率远超图形界面工具。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值