文本处理三剑客
2026-06-30
运维
00

目录

Linux 文本处理三剑客
总览
一、grep 文本检索(过滤行)
核心作用
常用基础参数
实用示例
二、sed 流编辑器(增、删、改、替换行)
核心作用
基础语法
常用动作
关键参数
高频实操案例
1. 替换 s 命令(最常用)
2. 删除行 d
3. 插入、追加文本 a / i
4. 只打印匹配行(-n + p)
三、awk 列处理、统计、结构化计算(三剑客最强)
核心作用
基础语法
内置核心变量
关键参数
基础示例
四、三剑客组合管道实战
场景1:Nginx日志统计PV、404报错
场景2:过滤配置,去除注释空行并替换IP
场景3:查看占用80端口进程号
场景4:批量清理日志多余空行+提取指定字段
核心分工总结

Linux 文本处理三剑客

总览

  • grep:过滤检索,抓匹配行
  • sed:流式编辑,增删改替换行
  • awk:列处理、统计计算,结构化文本分析

三者常组合管道 | 串联使用,是日志分析、脚本处理核心工具。

一、grep 文本检索(过滤行)

核心作用

逐行读取文本,匹配正则/普通字符串,输出命中行;只筛选,不修改原文。

常用基础参数

参数作用
-i忽略大小写匹配
-v反向匹配,输出不包含关键词的行
-n输出匹配行的行号
-c只统计匹配行数,不打印内容
-o只打印匹配到的字符串本身,不打印整行
-r / -R递归遍历目录下所有文件
-l只输出包含匹配内容的文件名
-A n匹配行 + 后n行
-B n匹配行 + 前n行
-C n匹配行 + 前后各n行

实用示例

  1. 基础匹配
bash
展开代码
# 查找包含error的行 grep "error" app.log # 忽略大小写查找 grep -i "error" app.log
  1. 反向过滤(排除注释空行)
bash
展开代码
# 过滤掉#开头注释、空行 grep -v "^#" nginx.conf | grep -v "^$"
  1. 递归批量查目录所有文件(你笔记里的命令)
bash
展开代码
# 写法1:find + xargs grep(兼容特殊文件名) find /home/test -type f | xargs grep "test" # 写法2:grep -r 简化递归 grep -r "test" /home/test/ # 只输出匹配的文件名称 grep -rl "test" /home/test/
  1. 日志上下文查看
bash
展开代码
# 打印error行及前后3行日志 grep -C 3 "error" app.log
  1. 统计报错行数
bash
展开代码
grep -c "Exception" app.log

二、sed 流编辑器(增、删、改、替换行)

核心作用

流式逐行处理文本,擅长行级操作,默认只输出到终端,不加 -i 不会修改原文件。

基础语法

sed [参数] '定位+动作' 文件

常用动作

  • s/old/new/:替换字符串
  • d:删除匹配行
  • a:匹配行下方新增行
  • i:匹配行上方插入行
  • p:打印匹配行(配合-n只输出匹配内容)

关键参数

  • -i:直接修改原文件;-i.bak 修改同时生成备份文件
  • -n:只打印被p动作匹配的行,屏蔽默认全量输出

高频实操案例

1. 替换 s 命令(最常用)

bash
展开代码
# 全局替换每行所有www为blog(g=global全局) sed 's/www/blog/g' test.txt # 只修改第二处匹配,不加g只替换每行第一个 sed 's/www/blog/2' test.txt # 直接修改原文件并备份test.txt.bak sed -i.bak 's/127.0.0.1/192.168.1.100/g' hosts # 匹配注释并取消注释(替换#开头空) sed -i 's/^#port/port/g' nginx.conf # 删除行首空格 sed 's/^ *//g' test.txt

2. 删除行 d

bash
展开代码
# 删除空行 sed '/^$/d' test.txt # 删除包含#注释的行 sed '/^#/d' nginx.conf # 删除第5行 sed '5d' test.txt # 删除10~20行区间 sed '10,20d' test.txt # 删除匹配error的行 sed '/error/d' app.log

3. 插入、追加文本 a / i

bash
展开代码
# 在第3行上方插入一行 sed '3i new_line' test.txt # 在匹配hostname行下方追加内容 sed '/hostname/a server_name=test' test.txt

4. 只打印匹配行(-n + p)

bash
展开代码
# 只输出包含root的行,等价grep sed -n '/root/p' /etc/passwd # 打印5-10行 sed -n '5,10p' test.txt

三、awk 列处理、统计、结构化计算(三剑客最强)

核心作用

分隔符切割文本为多列,擅长:字段筛选、数值运算、求和统计、格式化输出;处理日志、CSV、表格数据首选。

基础语法

awk '条件{执行动作}' 文件

内置核心变量

变量含义
$0整行全部内容
11 2 $3...第1列、第2列、第3列字段
NF当前行总列数
NR当前行号
FS输入分隔符,默认空格/制表符
OFS输出分隔符

关键参数

  • -F "分隔符":自定义字段分割符(逗号、冒号、/等)

基础示例

  1. 打印指定列
bash
展开代码
# /etc/passwd 冒号分隔,打印用户名($1)和shell($7) awk -F: '{print $1,$7}' /etc/passwd # 打印磁盘使用率第5列 df -h | awk '{print $5}' # 多列格式化输出,自定义分隔符 df -h | awk '{print $1"|"$2"|"$5}'
  1. 过滤条件筛选
bash
展开代码
# 只打印磁盘使用率超过80%的分区 df -h | awk 'NR>1 {gsub(/%/,"",$5);if($5>80) print $1,$5"%"}' # 匹配包含root的行输出第1列 awk -F: '/root/ {print $1}' /etc/passwd
  1. 数值统计(求和、计数)
bash
展开代码
# 统计日志总访问量,累加第4列数字 awk '{sum+=$4} END{print "总流量:",sum}' access.log # 统计文件行数(等价wc -l) awk 'END{print NR}' test.txt # 统计日志中200状态码行数 awk '$9==200 {count++} END{print count}' access.log
  1. 修改分隔符
bash
展开代码
# 逗号分割csv文件 awk -F, '{print $2}' data.csv # 输出用#分隔各列 awk -F: -v OFS="#" '{print $1,$3}' /etc/passwd

四、三剑客组合管道实战

场景1:Nginx日志统计PV、404报错

bash
展开代码
# 统计404报错数量 cat nginx.log | grep "404" | wc -l # awk一步统计 awk '$9==404 {num++} END{print num}' nginx.log

场景2:过滤配置,去除注释空行并替换IP

bash
展开代码
cat nginx.conf | grep -v "^#" | grep -v "^$" | sed 's/localhost/192.168.1.10/'

场景3:查看占用80端口进程号

bash
展开代码
netstat -tulnp | grep 80 | awk '{print $7}' | sed 's/\/.*//'

场景4:批量清理日志多余空行+提取指定字段

bash
展开代码
cat app.log | sed '/^$/d' | grep "WARN" | awk '{print $1,$5}'

核心分工总结

  1. grep:只筛选行 快速抓含关键词的日志行,过滤、看上下文、统计匹配行数。
  2. sed:行级编辑 替换字符串、删除无用行、插入配置,批量修改配置文件。
  3. awk:列级处理+统计 拆分字段、提取IP/端口/使用率、数字求和、条件判断,日志数据分析。
  4. 组合逻辑:grep 筛选行 → sed 修改内容 → awk 提取字段统计

本文作者:zzz

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!