yq 工具

news2024/11/22 22:07:32

文章目录

  • yq命令
    • 快速
  • Recipes
    • 查找数组中的项目
    • 查找并更新数组中的项目
    • 深度修剪一棵树
    • 对数组中的项目进行多次或复杂的更新
    • 按字段对数组进行排序
  • Operators
    • Omit
      • Omit keys from map
      • Omit indices from array
    • Delete
      • Delete entry in map
      • Delete nested entry in map
      • Delete entry in array
      • Delete nested entry in array
      • Delete no matches
      • Delete matching entries
      • Recursively delete matching keys

yq命令

用法:
  yq [标志]
  yq [命令]

示例:

# 如果未指定命令,yq 默认为 'eval' 命令。更多示例请参阅 "yq eval --help"
yq '.stuff' < myfile.yml    # 从 "myfile.yml" 中输出位于 "stuff" 节点的数据

yq -i '.stuff = "foo"' myfile.yml    # 就地更新 myfile.yml


可用命令:
  completion       生成指定shell的自动补全脚本
  eval             (默认)按顺序对每个 YAML 文件中的每份文档应用表达式
  eval-all         加载所有 YAML 文件的所有 YAML 文档,然后运行一次表达式
  help             任何命令的帮助

标志:
  -C, --colors                        强制使用颜色打印
  -e, --exit-status                   如果没有匹配项或返回 nullfalse,则设置退出状态
  -f, --front-matter string           (extract|process) 第一个输入作为 YAML 元数据。Extract 将提取 YAML 内容,process 将针对 YAML 内容运行表达式,保留其余数据不变
      --header-preprocess             吸收头部注释和分隔符,然后处理表达式。默认为真。
  -h, --help                          yq 帮助
  -I, --indent int                    设置输出缩进级别(默认为2-i, --inplace                       更新第一个给定文件的位置。
  -p, --input-format string           [yaml|y|xml|x] 输入解析格式。请注意,JSON 是 YAML 的子集。(默认为“yaml”)
  -M, --no-colors                     强制不带颜色打印
  -N, --no-doc                        不打印文档分隔符 (---)
  -n, --null-input                    不读取输入,只需评估给定的表达式。这对于从头创建文档很有用。
  -o, --output-format string          [yaml|y|json|j|props|p|xml|x] 输出类型。 (默认为“yaml”)
  -P, --prettyPrint                   美观打印,是 "... style ="" 的简写
  -s, --split-exp string              对每个结果(或文档)打印到名为(exp)的文件中。[exp] 参数必须返回字符串。您可以在表达式中使用 $index 作为结果计数器。
      --unwrapScalar                  解包标量,无引号、颜色或注释打印值(默认为真)
  -v, --verbose                       显示详细信息模式
  -V, --version                       打印版本信息并退出
      --xml-attribute-prefix string   XML 属性的前缀 (默认为"+")
      --xml-content-name string       当没有属性名称时,XML 内容的名称。 (默认为"+content")

使用 "yq [命令] --help" 了解有关命令的更多信息。

快速

# 4.18.1之前
cat file.yaml | yq e '.cool' -

# 4.18+
cat file.yaml | yq '.cool'
# 读取一个值:
yq '.a.b[0].c' file.yaml

# 来自 STDIN 的管道:
cat file.yaml | yq '.a.b[0].c'

# 就地更新 yaml 文件
yq -i '.a.b[0].c = "cool"' file.yaml

# 使用环境变量更新
NAME=mike yq -i '.a.b[0].c = strenv(NAME)' file.yaml

# 合并多个文件
yq ea '. as $item ireduce ({}; . * $item )' path/to/*.yml

# 对 yaml 文件进行多次更新
yq -i '
  .a.b[0].c = "cool" |
  .x.y.z = "foobar" |
  .person.name = strenv(NAME)
' file.yaml

在这里插入图片描述
在这里插入图片描述

Recipes

查找数组中的项目

- name: Foo
  numBuckets: 0
- name: Bar
  numBuckets: 0

yq '.[] | select(.name == "Foo")' sample.yml

name: Foo
numBuckets: 0

.[]展开数组,并将所有项目放入上下文中。
然后将这些项目通过管道 ( |)输入select(.name == "Foo"),将选择 name 属性设置为“Foo”的所有节点。

查找并更新数组中的项目

- name: Foo
  numBuckets: 0
- name: Bar
  numBuckets: 0

yq '(.[] | select(.name == "Foo") | .numBuckets) |= . + 1' sample.yml

- name: Foo
  numBuckets: 1
- name: Bar
  numBuckets: 0

从上面的示例开始,.[]splats 数组,选择过滤项目。

然后我们将|其通过管道 () 传送到.numBuckets,这将从所有匹配项中选择该字段

Splat、select 和字段都在括号中,整个表达式|=作为左侧表达式传递给运算符,作为. + 1右侧表达式传递给运算符。

|=是相对于其自身值更新字段的运算符,以点 ( ) 引用.。

该表达式. + 1会递增 numBuckets 计数器。

深度修剪一棵树

假设我们只对 child1 和 child2 感兴趣,并且想过滤掉其他所有内容。

parentA:
  - bob
parentB:
  child1: i am child1
  child3: hiya
parentC:
  childX: cool
  child2: me child2

yq '(
  .. |                                     # recurse through all the nodes
  select(has("child1") or has("child2")) | # match parents that have either child1 or child2
  (.child1, .child2) |                     # select those children
  select(.)                                # filter out nulls
) as $i ireduce({};                        # using that set of nodes, create a new result map
  setpath($i | path; $i)                   # and put in each node, using its original path
)' sample.yml

parentB:
  child1: i am child1
parentC:
  child2: me child2


查找所有匹配的child1和child2节点

使用 ireduce,仅使用这些节点创建一个新映射

使用其原始路径将每个节点设置到新地图中

对数组中的项目进行多次或复杂的更新

myArray:
  - name: Foo
    type: cat
  - name: Bar
    type: dog

yq 'with(.myArray[]; .name = .name + " - " + .type)' sample.yml

myArray:
  - name: Foo - cat
    type: cat
  - name: Bar - dog
    type: dog


with 运算符将有效地循环第一个给定表达式中的每个给定项目,并对其运行第二个表达式。

.myArray[]将数组展开到myArray.因此with将针对该数组中的每个项目运行

.name = .name + " - " + .type该表达式针对每个项目运行,将名称更新为原始名称和类型的串联。

按字段对数组进行排序

myArray:
  - name: Foo
    numBuckets: 1
  - name: Bar
    numBuckets: 0

yq '.myArray |= sort_by(.numBuckets)' sample.yml

myArray:
  - name: Bar
    numBuckets: 0
  - name: Foo
    numBuckets: 1

我们想去排序.myArray。

sort_by其工作原理是通过管道将一个数组输入其中,然后通过管道输出一个已排序的数组。

所以,我们使用|=更新.myArray。这与做相同.myArray = (.myArray | sort_by(.numBuckets))

Operators

Omit

Works likepick, but instead you specify the keys/indices that youdon’twant included.

Omit keys from map

myMap:
  cat: meow
  dog: bark
  thing: hamster
  hamster: squeak

yq '.myMap |= omit(["hamster", "cat", "goat"])' sample.yml

myMap:
  dog: bark
  thing: hamster

Omit indices from array

Note that non existent indices are skipped.

- cat
- leopard
- lion

yq 'omit([2, 0, 734, -5])' sample.yml

- leopard

Delete

Delete entry in map

# Given a sample.yml file of:
a: cat
b: dog

# then
yq 'del(.b)' sample.yml

# will output
a: cat

Delete nested entry in map

a:
  a1: fred
  a2: frood

yq 'del(.a.a1)' sample.yml

a:
  a2: frood

Delete entry in array

- 1
- 2
- 3

yq 'del(.[1])' sample.yml

- 1
- 3

Delete nested entry in array

- a: cat
  b: dog

yq 'del(.[0].a)' sample.yml

- b: dog

Delete no matches

a: cat
b: dog

yq 'del(.c)' sample.yml

a: cat
b: dog

Delete matching entries

a: cat
b: dog
c: bat

yq 'del( .[] | select(. == "*at") )' sample.yml

b: dog

Recursively delete matching keys

a:
  name: frog
  b:
    name: blog
    age: 12

yq 'del(.. | select(has("name")).name)' sample.yml

a:
  b:
    age: 12

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2203618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【重学 MySQL】六十三、唯一约束的使用

【重学 MySQL】六十三、唯一约束的使用 创建表时定义唯一约束示例 在已存在的表上添加唯一约束示例 删除唯一约束示例 复合唯一约束案例背景创建表并添加复合唯一约束插入数据测试总结 特点注意事项 在 MySQL 中&#xff0c;唯一约束&#xff08;UNIQUE Constraint&#xff09;…

butterfly主题留言板 报错记录 未解决

新建留言板&#xff0c;在博客根目录执行下面的命令 hexo new page messageboard 在博客/source/messageboard的文件夹下找到index.md文件并修改 --- title: 留言板 date: 2018-01-05 00:00:00 type: messageboard ---找到butterfly主题下的_config.yml文件 把留言板的注释…

基于springboot+小程序的智慧物流管理系统(物流1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于springboot小程序的智慧物流管理系统实现了管理员、司机及用户。 1、管理员实现了司机管理、用户管理、车辆管理、商品管理、物流信息管理、基础数据管理、论坛管理、公告信息管理等。…

帮助自闭症孩子融入社会,寄宿学校是明智选择

在广州这座充满活力与温情的城市&#xff0c;有一群特殊的孩子&#xff0c;他们被称为“星星的孩子”——自闭症儿童。自闭症&#xff0c;这个让人既陌生又熟悉的名词&#xff0c;背后承载的是无数家庭的辛酸与希望。对于自闭症儿童来说&#xff0c;融入社会、与人交流、理解世…

【Linux第一弹】- 基本指令

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

blender 记一下lattice

这个工具能够辅助你捏形状 这里演示如何操作BOX shift A分别创建俩对象一个BOX 一个就是lattice对象 然后在BOX的修改器内 创建一个叫做lattice的修改器 然后指定object为刚刚创建的lattice对象 这样就算绑定好了 接下来 进入lattice的编辑模式下 你选取一个点进行运动&#…

量化交易与基础投资工具介绍

&#x1f31f;作者简介&#xff1a;热爱数据分析&#xff0c;学习Python、Stata、SPSS等统计语言的小高同学~&#x1f34a;个人主页&#xff1a;小高要坚强的博客&#x1f353;当前专栏&#xff1a;Python之机器学习《Python之量化交易》Python之机器学习&#x1f34e;本文内容…

谈谈留学生毕业论文如何分析问卷采访数据

留学生毕业论文在设计好采访问题并且顺利进行了采访之后&#xff0c;我们便需要将得到的采访答案进行必要的分析&#xff0c;从而得出一些结论。我们可以通过这些结论回答研究问题&#xff0c;或者提出进一步的思考等等。那么我们应当如何分析采访数据呢&#xff1f;以下有若干…

python3开头如何设置utf-8

编码格式1&#xff1a; 在源文件第一行或者第二行定义&#xff1a; # coding<encoding name> 例如&#xff1a; # codingutf-8 编码格式2&#xff1a;&#xff08;这种最流行&#xff09; 格式如下&#xff1a; #!/usr/bin/python # -*- coding: <encoding name>…

信息安全工程师(43)入侵检测概述

一、定义与目的 入侵检测&#xff08;Intrusion Detection&#xff09;是指通过对行为、安全日志、审计数据或其他网络上可以获得的信息进行操作&#xff0c;检测到对系统的闯入或闯入的企图。其主要目的是确保网络安全和信息安全&#xff0c;保护个人和机构的敏感数据免受未经…

论文阅读:Split-Aperture 2-in-1 Computational Cameras (二)

Split-Aperture 2-in-1 Computational Cameras (一) Coded Optics for High Dynamic Range Imaging 接下来&#xff0c;文章介绍了二合一相机在几种场景下的应用&#xff0c;首先是高动态范围成像&#xff0c;现有的快照高动态范围&#xff08;HDR&#xff09;成像工作已经证…

FreeRTOS——任务创建(静态、动态创建)、任务删除以及内部实现剖析

任务创建和删除的API函数 任务的创建和删除本质就是调用FreeRTOS的API函数 API函数描述xTaskCreate()动态方式创建任务xTaskCreateStatic()静态方式创建任务vTaskDelete()删除任务 动态创建任务&#xff1a;任务的任务控制块以及任务的栈空间所需的内存&#xff0c;均有FreeR…

考研代码题:10.10 汉诺塔 爬楼梯 取球 猴子吃桃

汉诺塔 C语言 - 汉诺塔详解&#xff08;最简单的方法&#xff0c;进来看看就懂&#xff09;_汉诺塔c语言程序详解-CSDN博客 #include <stdio.h>void move(char begin,char end){printf("%c->%c\n",begin,end); } //begin开始杆&#xff0c;help辅助杆&am…

BUU刷题-Pwn-axb_2019_mips(MIPS跳转bss段执行shellcode)

解题所涉知识点&#xff1a; 泄露或修改内存数据&#xff1a; 堆地址&#xff1a;栈地址&#xff1a;libc地址&#xff1a;BSS段地址&#xff1a; 劫持程序执行流程&#xff1a;MIPS_ROP 获得shell或flag&#xff1a;[[MIPS_Shellcode]] && [[MIPS劫持RA寄存器]] 题…

开源文件管理工具File Browser本地部署并一键发布公网远程传输文件

文章目录 前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 File Browser是一个开源的文件管理器和文件共享工具&#xff0c;它可以帮助用户轻…

波轮洗衣机、滚筒洗衣机的清理方法

洗衣机主要分为波轮式、滚筒式这2种&#xff0c;波轮式是水平旋转的&#xff0c;滚筒式是竖直旋转的。波轮式洗衣机一般比较小&#xff0c;用于2至3个人的衣服清理&#xff1b;而滚筒式洗衣机则比较大&#xff0c;用于5至6人的衣服清理。 图(1) 波轮洗衣机 图(2) 滚筒洗衣机 不…

龋齿牙齿病变图像分割系统源码&数据集分享

龋齿牙齿病变图像分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-DCNV3&#xff06;yolov8-seg-RepHGNetV2等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Glo…

发送邮件和随机码的生成

类视图和方法视图区别&#xff1a; 不需要装饰器&#xff0c;只需要继承MethodView,需要使用什么方式就写对应的方法名称&#xff0c;它就能自动匹配 app.route("/delete/",methods["DELETE"])这些就不用写了 但是不写装饰器并不意味着不写路由了&#xff…

高效美发店运营:SpringBoot管理系统详解

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理美发门店管理系统的相关信息成为必然。开发…

k8s部署学习

8s的架构 一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成&#xff0c;每个节点上都会安装不同的组件 1 master&#xff1a;集群的控制平面&#xff0c;负责集群的决策 ApiServer : 资源操作的唯一入口&#xff0c;接收用户输入的命令&#xff0c;提供认证、…