惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
I
InfoQ
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
博客园_首页
罗磊的独立博客
V
V2EX
李成银的技术随笔
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
True Tiger Recordings
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
F
Fox-IT International blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
M
Microsoft Research Blog - Microsoft Research
Know Your Adversary
Know Your Adversary
爱范儿
爱范儿
The Register - Security
The Register - Security
G
Google Developers Blog
The Hacker News
The Hacker News
Malwarebytes
Malwarebytes
S
Securelist
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
博客园 - 叶小钗
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
博客园 - 聂微东
T
Threatpost
博客园 - 【当耐特】
D
Docker
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
V
Visual Studio Blog
C
Cisco Blogs
IT之家
IT之家
S
Security Archives - TechRepublic
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志

XINDOO

关于内卷,几个值得深想的洞察 当创作被 Skill 化:我用 AI 写了一部 320 章的长篇网文 AI第一剑,先斩程序员 AI 也会偷懒?这个 PUA 工具专治“摸鱼式编程” Gstack 深度解析:YC CEO 开源的 AI 工程团队 GitHub Trending霸榜!深度解析AI Coding辅助神器 Superpowers 深度探讨:从 OpenClaw 爆火,看 AI Agent 的真相与程序员的未来 我复刻了NotebookLM的信息图功能 我用AI写了部小说,这里是整个过程 [翻译]我在谷歌14年学到的21堂课 2万字吊打40万字:为什么我的“牛马Agent”比“数字分身”更聪明? 最近AI领域爆火的 Agent Skills 是什么? 从计算机科学的视角来看拖延症 一周改6个库后我悟了:AI时代,程序员正在退化成“甲方” 使用n8n做一个自动同步更新的Github项目问答机器人 Agent设计模式——第 20 章:优先级排序 Agent设计模式——第 1 章:提示词链 Agent设计模式——附录 D - 使用 AgentSpace 构建 Agent Agent设计模式——第 19 章:评估和监控 Agent设计模式——第 10 章:模型上下文协议 (MCP) Agent设计模式——第 21 章:探索和发现 Agent设计模式——智能体设计模式 Agent设计模式——第 11 章:目标设定和监控 Agent设计模式——第 9 章:学习和适应 Agent设计模式——第 16 章:资源感知优化 Agent设计模式——附录 G - 编码 Agent Agent设计模式——第 13 章:人机协同 Agent设计模式——第 17 章:推理技术 Agent设计模式——附录 F - 深入剖析:Agent 推理引擎的内部运作机制 Agent设计模式——章节目录 Agent设计模式—— Agent设计模式——术语表 Agent设计模式——第 7 章:多 Agent 协作 Agent设计模式——附录 E - 命令行界面中的 AI Agent Agent设计模式——附录 C - Agentic 框架快速概览 Agent设计模式——第 3 章:并行化 Agent设计模式——术语表 Agent设计模式——**常见问题解答:Agentic 设计模式** Agent设计模式——第 14 章:知识检索(RAG) Agent设计模式——第 18 章:Guardrails/安全模式 Agent设计模式——第 15 章:Agent 间通信(A2A) Agent设计模式——第 8 章:内存管理 Agent设计模式——第 12 章:异常处理和恢复 Agent设计模式——第 4 章:反思 Agent设计模式——附录 B - AI Agentic 交互:从图形界面到现实世界环境 Agent设计模式——第 5 章:工具使用(函数调用) Agent设计模式——结论 Agent设计模式——第 6 章:规划 Agent设计模式——第 2 章:路由 从经验主义到贝叶斯理论:如何排查线上问题 我用AI为自己造了一把安全的开发者“瑞士军刀”” 从LLM和MCP的协同过程看如何做优化 打通Dify与AI工具生态:将Workflow转为MCP工具的实践 一文了解知识库背后的技术RAG AI应用的五个级别:从入门到专家的进阶之路 一文入门AI圈最近爆火的MCP协议 HTTP/3:性能改进(第 2 部分) deepseek-r1祛魅:从过度热捧到理性认知⁠ 为什么AI智能体需要工作流 如何用GPT-4o解读视频 OpenAI的结构化浅析 从大模型的原理到提示词优化 从经济学原理看团队分工合作 [翻译]关于人工智能的30个思考 从马斯洛需求层次理论谈职场激励 知识与智慧 如何使用大语言模型绘制专业图表 两个开源项目打造自己的大模型聚合平台 我让gpt4o给我推荐了一千多次书 得到了这些数据 用Langchain创建一个可以总结网页内容的Agent 推荐一个好用的命令行工具ShellGPT 关于ffmpeg height not divisible by 2的错误 使用Certbot解决https证书自动更新的问题 Spring Cache简明教程 软件开发中的抓大放小vs极致细节思维 OpenAI Assistants-API简明教程 OpenAI的多函数调用(Multiple Function Calling)简介 如何使用ffmpeg制作透明背景的视频 spring-kafka中ContainerProperties.AckMode详解 如何在地图上寻找最密集点的位置? IO密集型服务提升性能的三种方法 职场中的基本归因错误和自利归因 使用javax.validation.constraints校验参数合法性 Java Optional:让你的代码更优雅 ChatGPT函数调用初体验:让ChatGPT具备抓取网页文本的能力 如何使用ChatGPT提升自己的“码”力? 使用ffmpeg拼接两张图片 ThreadPoolExecutor——高效处理并发任务的必备良器 从CPU的视角看 多线程代码为什么那么难写! 使用ffmpeg缩小视频体积的几种方式 Linux parallel 命令使用手册 为什么说过早优化是万恶之源? Linux xargs命令介绍 深入理解Spring的事件通知机制 Java高并发之CyclicBarrier简介 聊一聊过度设计! 详解Redisson分布式限流的实现原理 Java中使用HashMap时指定初始化容量性能一定会更好吗? 如何用ffmpeg截取视频片段&截取时间不准确的坑 XINDOO的2022年年终总结
json命令行处理神器jq介绍
2024-11-03 · via XINDOO


  在当今数据驱动的世界中,处理JSON格式的数据已成为许多IT专业人士的日常任务。虽然Python等高级编程语言可以胜任这项工作,但它们往往需要编写复杂的脚本,耗时且容易出错。这就是jq命令行工具的亮点所在。

  jq是一款强大而高效的JSON处理工具,它能让你在命令行中轻松地过滤、转换和操作JSON数据。无论你是开发者、系统管理员还是数据分析师,掌握jq都能极大地提升你的工作效率。它不仅能简化复杂JSON数据的处理过程,还能帮助你更快地理解和分析数据结构。

  在这篇文章中,我们将深入探讨jq的使用方法,从基础操作到高级技巧,帮助你成为JSON数据处理的专家。无论你是初学者还是有经验的程序员,本文都能为你提供有价值的见解和实用技巧。让我们一起开启jq的学习之旅,掌握这个改变游戏规则的工具!

  首先,jq命令在许多操作系统中并非默认安装,因此需要手动安装。例如,在我使用的Mac系统上,我可以通过Homebrew来安装jq。在终端中运行以下命令即可安装:

brew install jq

  安装完成后,我们就可以开始使用jq来处理JSON数据了。让我们从一些基本的操作开始,逐步深入了解jq的强大功能。

基本用法

  jq的基本语法如下:

jq [options] filter [file...]

  其中,filter是用于处理JSON数据的表达式。这个表达式可以是简单的字段选择器,也可以是复杂的条件语句或函数组合。filter的语法非常灵活,允许用户执行各种操作,如:

  • 提取特定字段或数组元素
  • 基于条件过滤数据
  • 转换数据结构
  • 执行数学运算或字符串操作

  filter 的强大之处在于它可以链式组合多个操作,使用管道符 | 连接,从而实现复杂的数据处理流程。例如,'.[] | select(.age > 30) | .name' 这个 filter 会先展开数组,然后选择年龄大于 30 的元素,最后只输出名字字段。

常用操作

1. 提取字段

使用 . 后跟字段名来提取特定字段。这是jq最基本也是最常用的操作之一。具体来说:

  1. 点号(.)表示当前的JSON对象。
  2. 在点号后直接跟上字段名,就可以访问该字段的值。
  3. 如果字段名包含特殊字符或空格,可以使用引号将其括起来,如 ."field name"。
  4. 对于嵌套的JSON结构,可以使用多个点号,如 .user.name。

这种方式使得从复杂的JSON结构中提取所需信息变得简单直观。例如:

echo '{"name": "John", "age": 30}' | jq '.name'
# 输出: "John"

2. 数组操作

使用 [] 来操作数组。jq提供了多种方式来处理JSON数组:

  • 索引访问:使用 .[index] 来访问特定索引的元素。例如,.[0] 获取第一个元素。
  • 切片:使用 .[start:end] 获取数组的一部分。例如,.[1:3] 获取从第二个到第三个元素。
  • 迭代:使用 .[] 遍历数组中的所有元素。
  • 数组操作函数:jq提供了许多内置函数来处理数组,如 length, map, reduce 等。

以下是一些具体的例子:

# 获取第一个元素
echo '[1, 2, 3, 4]' | jq '.[0]'
# 输出: 1

# 获取数组切片
echo '[1, 2, 3, 4]' | jq '.[1:3]'
# 输出: [2, 3]

# 遍历数组
echo '[1, 2, 3, 4]' | jq '.[]'
# 输出:
# 1
# 2
# 3
# 4

# 使用map函数对每个元素进行操作
echo '[1, 2, 3, 4]' | jq 'map(. * 2)'
# 输出: [2, 4, 6, 8]

这些操作使得处理JSON数组变得非常灵活和强大,可以轻松地提取、转换和分析数组数据。

3. 过滤

  使用 select 函数进行过滤是jq的一个强大特性。select 函数允许我们基于特定条件从JSON数据中筛选出所需的元素。它的基本语法如下:

select(boolean_expression)

  其中,boolean_expression 是一个返回true或false的表达式。只有当这个表达式为true时,当前的JSON对象才会被选中。select 函数通常与 .[] (数组迭代器)配合使用,以便遍历数组并筛选出符合条件的元素。

以下是一些常见的用法:

# 基于数值比较进行过滤
echo '[{"age": 25}, {"age": 35}]' | jq '.[] | select(.age > 30)'

# 基于字符串匹配进行过滤
echo '[{"name": "John"}, {"name": "Alice"}]' | jq '.[] | select(.name == "John")'

# 使用正则表达式进行过滤
echo '[{"name": "John"}, {"name": "Alice"}]' | jq '.[] | select(.name | test("^J"))'

# 组合多个条件
echo '[{"age": 35, "city": "New York"}, {"age": 25, "city": "London"}]' | jq '.[] | select(.age > 30 and .city == "New York")'

# 嵌套结构中的过滤
echo '[{"address": {"city": "London"}}, {"address": {"city": "Paris"}}]' | jq '.[] | select(.address.city == "London")'

使用 select 函数能显著简化复杂 JSON 数据的处理过程,让数据筛选变得既直观又高效。

4. 转换

  使用管道 | 来组合多个操作是jq的一个强大特性。这允许我们将多个jq过滤器链接在一起,以执行复杂的数据转换和处理。每个管道阶段的输出成为下一个阶段的输入,使得我们可以逐步构建复杂的查询。以下是管道操作的一些关键点:

  • 顺序执行:管道中的操作从左到右依次执行,每个操作的结果传递给下一个操作。
  • 数据流转:管道允许数据在不同的处理阶段之间流动,每个阶段可以对数据进行特定的转换或过滤。
  • 灵活组合:可以组合任意数量的jq过滤器,包括字段选择、数组操作、条件过滤等。
  • 中间结果:在复杂的管道中,可以使用括号 () 来分组操作或创建中间结果。

  通过使用管道,我们可以将复杂的数据处理任务分解为一系列简单的步骤,使得代码更易读、更易维护。例如:

echo '{"user": {"name": "John", "age": 30}}' | jq '.user | {name: .name, is_adult: (.age >= 18)}'
# 输出: {"name": "John", "is_adult": true}

高级特性

  jq还提供了许多高级特性,让我们能够更灵活地处理复杂的JSON数据。以下是一些主要的高级特性及其简单示例:

  • 条件语句和循环:jq支持if-then-else结构和循环操作,使得我们可以根据条件执行不同的操作或重复执行某些操作。
    示例:jq 'if .age > 18 then "Adult" else "Minor" end'
    这个例子根据age字段的值返回"Adult"或"Minor"。
  • 自定义函数:jq允许我们定义自己的函数,以便重用复杂的逻辑。
    示例:jq 'def increment(x): x + 1; map(increment)'
    这个例子定义了一个increment函数,并将其应用到数组的每个元素上。
  • 正则表达式支持:jq内置了强大的正则表达式支持,可以用于复杂的字符串匹配和操作。
    示例:jq 'select(.name | test("^A"))'
    这个例子选择所有名字以字母A开头的项。
  • 数学运算:jq支持各种数学运算,从基本的加减乘除到更复杂的函数。
    示例:jq 'map(.price * 1.1)'
    这个例子将所有价格提高10%。

总结

  jq是一个功能强大且灵活的JSON处理工具,它极大地简化了命令行环境下JSON数据的处理过程。通过本文介绍的基本操作(如提取字段、数组操作、过滤和转换)以及高级特性(如条件语句、自定义函数、正则表达式支持和数学运算),jq能够轻松应对从简单的数据提取到复杂的数据转换的各种任务。

  jq的优势在于其简洁而强大的语法,允许用户通过链式操作和管道组合多个过滤器,从而实现复杂的数据处理流程。这使得即使面对大型或复杂的JSON数据集,也能够快速高效地进行分析和操作。

  对于经常需要处理JSON数据的开发者、数据分析师和系统管理员来说,掌握jq是一项极其有价值的技能。它不仅可以提高工作效率,还能为数据处理和分析提供更多可能性。随着JSON格式在API、配置文件和数据交换中的广泛应用,jq的重要性只会越来越高。

备注:本文包含AI创作内容。

xindoo

10+年技术博主,博客专家,曾就职于阿里 小米,目前任贝壳资深工程师。拥有运维、搜索广告、后端业务相关工作经验,擅长Java、Lniux、Redis……