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

推荐订阅源

Google DeepMind News
Google DeepMind News
S
Secure Thoughts
Application and Cybersecurity Blog
Application and Cybersecurity Blog
AWS News Blog
AWS News Blog
GbyAI
GbyAI
腾讯CDC
WordPress大学
WordPress大学
V
V2EX
小众软件
小众软件
C
CXSECURITY Database RSS Feed - CXSecurity.com
M
MIT News - Artificial intelligence
T
Troy Hunt's Blog
H
Hacker News: Front Page
Scott Helme
Scott Helme
The Hacker News
The Hacker News
Schneier on Security
Schneier on Security
K
Kaspersky official blog
S
Security @ Cisco Blogs
N
News | PayPal Newsroom
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Threatpost
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Martin Fowler
Martin Fowler
P
Privacy International News Feed
Blog — PlanetScale
Blog — PlanetScale
D
DataBreaches.Net
O
OpenAI News
P
Proofpoint News Feed
J
Java Code Geeks
B
Blog RSS Feed
Attack and Defense Labs
Attack and Defense Labs
L
Lohrmann on Cybersecurity
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
阮一峰的网络日志
阮一峰的网络日志
P
Palo Alto Networks Blog
Engineering at Meta
Engineering at Meta
AI
AI
Google DeepMind News
Google DeepMind News
雷峰网
雷峰网
Microsoft Azure Blog
Microsoft Azure Blog
Simon Willison's Weblog
Simon Willison's Weblog
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
G
GRAHAM CLULEY
A
Arctic Wolf
N
Netflix TechBlog - Medium
L
LINUX DO - 最新话题
爱范儿
爱范儿
博客园 - 聂微东

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设计模式——第 7 章:多 Agent 协作 Agent设计模式——附录 E - 命令行界面中的 AI Agent Agent设计模式——附录 C - Agentic 框架快速概览 Agent设计模式——第 3 章:并行化 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年年终总结 使用ffmpeg将视频转成HLS(m3u8)格式 谷歌Guava LoadingCache介绍
json命令行处理神器jq介绍
xindoo · 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创作内容。