Linux 文本处理完整指南:grep、awk、sed、jq 命令详解与实战

495次阅读
没有评论

本文将教你如何使用 grep、awk、sed 和 jq 实现高效的 Linux 文本处理。这份实用指南涵盖语法、真实场景案例及最佳实践,适用于系统管理员、开发人员和数据工程师。

如果你有过 Linux 操作经验,就会知道文本处理是绕不开的核心需求。无论是解析几 GB 的服务器日志、从 CSV 文件中提取关键信息、批量修改配置文件,还是处理 API 返回的 JSON 数据,你都需要快速且灵活的工具来应对。

好消息是,Linux 自带四款“神器”:grepawksed  和  jq。它们各自有独特优势,搭配使用时能解决 90% 的文本处理问题。本文会跳过枯燥的理论,聚焦“当下就能用的实操内容”,带你快速上手。

一、Linux 文本处理工具简介

Linux 中的文本处理本质上可归为四类核心任务:搜索、提取、编辑和解析结构化数据。这些工具体积轻量、多数 Linux 发行版预装,且专为命令行效率设计。它们的分工如下:

  • grep:“搜索高手”,用于查找文本中的匹配模式
  • awk:“数据专家”,用于从结构化文本中提取信息并计算
  • sed:“流编辑器”,用于批量修改文本内容
  • jq:“JSON 利器”,用于过滤和转换 JSON 数据

二、grep:高效查找文本内容

grep(全称为 Global Regular Expression Print)是定位匹配模式行的首选工具。即便处理大文件,它也能保持极快速度,且支持正则表达式实现精准搜索。

核心特性

  • 支持基础与扩展正则表达式
  • 可递归搜索目录下的所有文件
  • 提供大小写不敏感、显示行号、反向匹配等功能

实操案例

基础搜索 :在日志文件中查找所有“ERROR”条目:

grep "ERROR" server.log

大小写不敏感 + 显示行号 :捕捉“error”“Error”等所有变体,并显示对应行号:

grep -i -n "error" server.log

递归搜索 :在所有 Python 文件中查找“TODO”注释:

grep -r "TODO" *.py

反向匹配 :显示不包含“DEBUG”的行(适合过滤冗余信息):

grep -v "DEBUG" server.log

三、awk:提取与分析结构化数据

awk  不只是工具,更像一门用于文本处理的迷你编程语言。它擅长逐行处理结构化数据(如 CSV 文件或格式固定的日志),能将行拆分为列并执行逻辑运算。

核心特性

  • 可将行拆分为自定义字段(默认以空白字符为分隔符)
  • 支持条件判断、循环和算术运算
  • 借助 BEGIN/END 块实现初始化 / 收尾操作

实操案例

提取 CSV 字段 :从  users.csv(列结构:姓名,年龄,城市)中打印姓名和城市:

awk -F',' '{print $1", "$3}' users.csv

输出结果:

Alice, New York
Bob, London
Charlie, Paris

条件过滤 :列出年龄超过 30 岁的用户:

awk -F',' '$2 > 30 {print $1}' users.csv

计算总和 :统计 CSV 文件中所有用户的年龄总和:

awk -F',' '{sum += $2} END {print sum}' users.csv

四、sed:批量编辑文本流

sed(Stream Editor,流编辑器)专为无需打开文件即可修改文本设计。它非常适合查找替换、删除行或插入内容,尤其在脚本自动化中作用显著。

核心特性

  • 可直接修改文件(原地编辑)或仅输出到终端
  • 使用正则表达式匹配模式
  • 非交互式操作,适合自动化场景

实操案例

查找替换 :将  server.log  中的“ERROR”替换为“WARNING”(先预览效果):

sed 's/ERROR/WARNING/g' server.log

原地编辑 :直接修改文件内容(添加  .bak  可生成备份文件:-i.bak):

sed -i 's/ERROR/WARNING/g' server.log

删除行 :移除所有包含“DEBUG”的行:

sed '/DEBUG/d' server.log

五、jq:处理 JSON 数据

如今 API 和 JSON 配置文件广泛使用,jq  已成为命令行解析 JSON 的必备工具。它能将杂乱的 JSON 格式化为易读形式,还支持通过简单语法过滤、转换数据。

核心特性

  • 可查询嵌套的 JSON 对象 / 数组
  • 支持过滤、映射和聚合操作
  • 能格式化输出结果,提升可读性

实操案例

假设有  data.json  文件,内容如下:

[
  {"name": "Alice", "age": 25, "city": "New York"},
  {"name": "Bob", "age": 30, "city": "London"},
  {"name": "Charlie", "age": 35, "city": "Paris"}
]

提取姓名 :从 JSON 数组中获取所有姓名:

jq '.[].name' data.json

按年龄过滤 :查找年龄超过 30 岁的用户:

jq '.[] | select(.age > 30) | .name' data.json

六、工具组合:真实场景流水线

通过 Linux 管道(|)将这些工具串联使用,才能发挥真正的威力。以下是两个常见的实际工作流:

案例 1:分析 Web 服务器日志

从  access.log  中提取 404 错误对应的 IP 地址和 URL:

grep "404" access.log | awk '{print $1, $7}'

案例 2:转换 JSON 日志

在  api.log  中过滤出  /api  开头的接口,并将状态码“200”替换为“OK”:

jq '.[] | select(.endpoint | startswith("/api"))' api.log | sed 's/"status": 200/"status":"OK"/g'

七、进阶技巧

  • 逐步测试正则表达式 :复杂正则容易出错,可先用 grep -E(扩展正则)测试部分逻辑。
  • 编辑前先备份 :使用 sed -i.bak 生成备份文件,或先不添加 -i 测试命令效果,避免误删数据。
  • 牢记常用参数
    • grep-i(大小写不敏感)、-r(递归搜索)
    • awk-F(指定字段分隔符)、END(最终执行的操作)
    • seds/ 匹配模式 / 替换内容 /g(全局替换)
    • jq.[](遍历数组)、select()(过滤数据)
  • 查阅手册 :遇到特殊场景时,可通过 man grep 或 man jq 查看详细文档。

八、总结

grep、awk、sed 和 jq 不只是“工具”,更是能将繁琐文本处理转化为一行命令的“时间节省器”。你只需从小场景开始尝试(比如解析一份日志、编辑一个 CSV 文件),慢慢就会发现它们已成为日常工作的“第二本能”。

正文完
 0
Fr2ed0m
版权声明:本站原创文章,由 Fr2ed0m 于2025-08-13发表,共计2590字。
转载说明:Unless otherwise specified, all articles are published by cc-4.0 protocol. Please indicate the source of reprint.
评论(没有评论)