AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题

问题[jq](unix)

Martin Hope
tinlyx
Asked: 2024-07-25 17:41:07 +0800 CST

如何使用 jq 创建具有路径值对(而不是键值对)的 JSON 对象?

  • 5

在jq脚本中,我需要使用路径值对(比旧的键值对更通用)创建 json 对象。也就是说,我需要使用路径而不是键,以便在更深层次上创建值。(这些路径是外部提供的,所以我事先不知道它们。)

例如,在非工作伪代码中,我想使用路径来创建这样的对象:

jq -n '{"a"."x" : 3, "b"."y" : 4}'

这样它就会创建相同的 json 对象jq -n '{"a":{"x" : 3}, "b":{"y" : 4}}',即

{
  "a": {
    "x": 3
  },
  "b": {
    "y": 4
  }
}

在某种程度上,这类似于mdir -p允许直接创建一个包含路径上所有祖先目录的目标目录。但我需要对(许多)json 对象执行此操作。因此,问题是:

使用本机 jq(可能加上一些 bash)通过路径值对创建对象的最简单方法是什么?

(我正在寻找一种复杂度较低且不需要进行大量编程的解决方案。这是在 Ubuntu 24.04 LTS 下使用 jq-1.7.1 实现的)

-- 澄清 --

我想到的输入是路径列表加上值列表,例如:

[".a.x", ".b.y"] 

和

[3, 4]

。路径由点分隔。为简单起见,我假设点之间的每个部分都是一个简单的标识符,例如y(而不是复杂的标识符,例如"y.z")。也就是说,我不考虑(目前)这样的路径:

[".a.x", ".b.\"y.z\""]
jq
  • 1 个回答
  • 40 Views
Martin Hope
Victor Gonyo
Asked: 2024-05-30 04:36:18 +0800 CST

与JQ合并

  • 8

我希望将两个不同的 JSON 文件合并到一个文件中 -

文件1

[
  {
    "namespace": "lerjr-rb26-sandbox-keycloak",
    "name": "keycloak",
    "url": "REMOVED"
  },
  {
    "namespace": "prometheus-brr1-sandbox",
    "name": "abacus",
    "url": "REMOVED"
  },
  {
    "namespace": "prometheus-brr1-sandbox",
    "name": "keycloak",
    "url": "REMOVED"
  },
  {
    "namespace": "prometheus-nginxredirect-sandbox",
    "name": "riskpoynt-redirect444",
    "url": "REMOVED"
  },
  {
    "namespace": "prometheus-nginxredirect-sandbox",
    "name": "riskpoynt-redirect447",
    "url": "REMOVED"
  },
  {
    "namespace": "prometheus-x105-sandbox",
    "name": "epas",
    "url": "REMOVED"
  },
  {
    "namespace": "prometheus-x105-sandbox",
    "name": "epas-oidc",
    "url": "REMOVED"
  },
  {
    "namespace": "prometheus-x105-sandbox",
    "name": "keycloak",
    "url": "REMOVED"
  }
]

文件2

[
  {
    "namespace": "ler-rb26-sandbox",
    "labels": {
      "pg.customerName": "prometheus",
      "pg.customerCode": "rb26",
      "pg.product": "keycloak",
      "pg.environment": null
    }
  },
  {
    "namespace": "lerjr-rb26-sandbox-keycloak",
    "labels": {
      "pg.customerName": "lerjr",
      "pg.customerCode": "rb26",
      "pg.product": "keycloak",
      "pg.environment": null
    }
  },
  {
    "namespace": "prometheus-brr1-sandbox",
    "labels": {
      "pg.customerName": "prometheus",
      "pg.customerCode": null,
      "pg.product": null,
      "pg.environment": null
    }
  }
]

预期产出

[
  {
    "namespace": "lerjr-rb26-sandbox-keycloak",
    "labels": {
      "pg.customerName": "lerjr",
      "pg.customerCode": "rb26",
      "pg.product": "keycloak",
      "pg.environment": null
    },
    "ingresses": [
      {
        "name": "keycloak",
        "url": "REMOVED"
      }
    ]
  },
  {
    "namespace": "prometheus-brr1-sandbox",
    "labels": {
      "pg.customerName": "prometheus",
      "pg.customerCode": null,
      "pg.product": null,
      "pg.environment": null
    },
    "ingresses": [
      {
        "name": "abacus",
        "url": "REMOVED"
      },
      {
        "name": "keycloak",
        "url": "REMOVED"
      }
    ]
  },
  {
    "namespace": "prometheus-nginxredirect-sandbox",
    "labels": {
      "pg.customerName": "null",
      "pg.customerCode": null,
      "pg.product": null,
      "pg.environment": null
    },
    "ingresses": [
      {
        "name": "riskpoynt-redirect444",
        "url": "REMOVED"
      },
      {
        "name": "riskpoynt-redirect447",
        "url": "REMOVED"
      }
    ]
  },
  {
    "namespace": "prometheus-x105-sandbox",
    "labels": {
      "pg.customerName": "null",
      "pg.customerCode": null,
      "pg.product": null,
      "pg.environment": null
    },
    "ingresses": [
      {
        "name": "epas",
        "url": "REMOVED"
      },
      {
        "name": "epas-oidc",
        "url": "REMOVED"
      },
      {
        "name": "keycloak",
        "url": "REMOVED"
      }
    ]
  }
]

请注意,最终产品具有标签(如果不存在则为 null),并且如果没有入口,则删除名称空间条目。命名空间键/值对是两个文件之间的链接 - 我想文件 1 是主文件,如果文件 1 中没有命名空间条目,我不希望文件 2 中的命名空间条目。

任何和所有的帮助将不胜感激,我一直在努力解决这个问题。

jq
  • 1 个回答
  • 112 Views
Martin Hope
deanresin
Asked: 2023-11-12 05:43:42 +0800 CST

如何将时间戳值转换为数字,然后转换为人类可读的

  • 9

我有一个字符串时间戳键,我需要转换为数字,因为strftime会抛出一个错误,它需要是一个数字。

journalctl -n1 --output=json | jq '.__REALTIME_TIMESTAMP | tonumber |= (. / 1000 | strftime("%Y-%m-%d")), .MESSAGE'

但我收到无效路径表达式错误。我想我的语法不正确。

__REALTIME_TIMESTAMP我最终想以人类可读的格式和 key显示 key MESSAGE。

jq
  • 1 个回答
  • 183 Views
Martin Hope
Manuel Rijo
Asked: 2023-07-23 11:58:42 +0800 CST

jq 未显示所有结果

  • 5

我有以下 json:

[
  {
    "_source": {
      "layers": {
        "http2": {
          "http2.stream": {
            "http2.length": "1030"
          }
        },
        "http2": {
          "http2.stream": {
            "http2.length": "1246"
          }
        }
      }
    }
  }
]

我正在执行以下jq命令:

jq '.[]._source.layers.http2."http2.stream"' file.json

我期望得到以下结果:

{
  "http2.length": "1030"
}
{
  "http2.length": "1246"
}

但我只得到:

{
  "http2.length": "1246"
}
jq
  • 1 个回答
  • 22 Views
Martin Hope
gremo
Asked: 2023-06-30 07:35:23 +0800 CST

从 semver 版本号数组到 jq 中的主要/次要对象哈希,甚至可能吗?

  • 6

输入

[
  "8.1.1",
  "7.4.33",
  "7.4.5",
  "8.2.6"
]

输出

{
  "7": "7.4.33",
  "7.4": "7.4.33",
  "8": "8.2.6",
  "8.1": "8.1.1",
  "8.2": "8.2.6"
}

输出是一个对象,其中:

  • 存在等于主要版本的键(即8),值是该主要版本的最大版本
  • 存在等于Major.minor 的键(即7.4),值是该主要/次要版本的最大版本

经过大量的试验和错误,现在我只能提取专业并简化为数组。任何帮助深表感谢!

echo "[\"8.1.1\",\"7.4.33\",\"7.4.5\",\"8.2.6\"]" | jq -n 'reduce input[] as $version ({}; .[($version | split(".")[0])] += [$version])'

哪个输出:

{
  "8": [
    "8.1.1",
    "8.2.6"
  ],
  "7": [
    "7.4.33",
    "7.4.5"
  ]
}

编辑:作为参考并避免歧义,对于那些能够理解 PHP 的人来说,这是一个执行相同操作的 CLI 脚本:

#!/usr/bin/env php
<?php

array_shift($argv);
usort($argv, 'version_compare');

echo json_encode(
    array_reduce(
        array_reverse($argv),
        function (array $prev, $version) use($argv) {
            [$major, $minor] = explode('.', $version, 3);
            $majors = array_filter($argv, function ($v) use ($major) {
                return substr($v, 0, 1) === $major;
            });
            $minors = array_filter($argv, function ($v) use ($major, $minor) {
                return substr($v, 0, 3) === "$major.$minor";
            });

            return $prev + [
                $major => end($majors),
                "$major.$minor" => end($minors),
            ];
        },
        []
    ),
    JSON_FORCE_OBJECT
);
jq
  • 1 个回答
  • 43 Views
Martin Hope
Kusalananda
Asked: 2023-04-26 23:26:47 +0800 CST

如何参数化 `jq` 表达式以返回选择或其补码?

  • 6

让我们假设我有两个非常复杂的jq表达式,但它们的不同之处仅在于一个返回另一个的补码,即它们之间的唯一区别是一个做select(expression)而另一个做select(expression|not)。

简化示例:

$ jq -n '$ARGS.positional[] | select( . > 2 )' --jsonargs 1 2 3 4 5
3
4
5
$ jq -n '$ARGS.positional[] | select( . > 2 | not )' --jsonargs 1 2 3 4 5
1
2

与其jq在我的代码中重复这两个不同的表达式(实际上,每个表达式只有几行),不如将一个值传递到单个表达式中以在两种行为之间切换会很整洁。

我怎样才能做到这一点?


实际jq代码(根据消息负载中编码的文件路径过滤 RabbitMQ 消息):

map(
        # Add an array of pathnames that would match this message.  This
        # includes the pathnames of each parent directory, leading up to
        # and including the pathname of the file itself.
        .tmp_paths = [
                # The full pathname is part of a base64-encodod JSON blob.
                foreach (
                        .payload |
                        @base64d |
                        fromjson.filepath |
                        split("/")[]
                ) as $elem (
                        null;
                        . += $elem + "/";
                        .
                )

        ] |
        # The last element is the full file path and should not have a
        # trailing slash.
        .tmp_paths[-1] |= rtrimstr("/")
) |
[
        # Match the pathnames given as positional command line arguments
        # against the computed pathnames in the "tmp_paths" array in
        # each message.  Extract the messages with a match.
        JOIN(
                INDEX($ARGS.positional[]; .);
                .[];
                .tmp_paths[];
                if (.[1:] | any) then
                        .[0]
                else
                        empty
                end
        )
] |
# Deduplicate the extracted messages on the full pathname of the file.
# Then remove the "tmp_paths" array from each message and base64 encode
# them.
unique_by(.tmp_paths[-1])[] |
del(.tmp_paths) |
@base64

我假设我需要if以某种方式修改该语句以使其提取或丢弃其文件路径与作为位置参数给出的路径名匹配的消息。

jq
  • 2 个回答
  • 58 Views
Martin Hope
YourMJK
Asked: 2023-02-27 03:36:52 +0800 CST

使用 jq 在 JSON 字符串值中保留转义的正斜杠

  • 8

根据 JSON 规范,正斜杠不必用反斜杠转义,但可以。
我有一个 JSON 文件,其中出于兼容原因(但不在键内)转义了字符串值中的所有正斜杠:

{
  "proto://some/path": "\/\/some\/path"
}

但是,jq自动删除这些反斜杠:

$ echo '{"proto://some/path":"\/\/some\/path"}' | jq -c .
{"proto://some/path":"//some/path"}

我需要输出是{"proto://some/path":"\/\/some\/path"}

我怎么知道jq不要更改任何字符串值并保留这些反斜杠?或者,有没有办法在它通过后将
这些反斜杠仅重新添加到值中jq?

jq
  • 2 个回答
  • 300 Views
Martin Hope
user1424739
Asked: 2022-12-15 19:36:36 +0800 CST

如何使用 jq 将命令行中的 bash 数组转换为 json 数组?[复制]

  • 5
这个问题在这里已经有了答案:
从 jq 构建 json (2 个答案)
4 天前关闭。
$ jq -c -n -e '[$x, $y]' --argjson x '"a"' --argjson y '"b"'
["a","b"]

我知道我可以做上面那样的事情。如果我想从 bash 数组生成一个 json 数组,如下所示。有没有办法使用任意长度的参数来做到这一点?

$ jq {some jq arguments} a b c # the bash array can be of an arbitrary length.
["a","b","c"]

注意 a、b、c 没有在命令行中引用,因为我希望输入简单。

jq
  • 1 个回答
  • 39 Views
Martin Hope
Suhayb
Asked: 2022-11-23 09:54:55 +0800 CST

如何使用 jq 将 JSON 解析为环境变量

  • 5

我有以下 json 结构

[{"name":"SQS_URL","value":"xyz"}]

我想将其转换为这种结构

SQS_URL=XZY
jq
  • 2 个回答
  • 45 Views
Martin Hope
King
Asked: 2022-10-10 08:34:54 +0800 CST

JSON:为值匹配模式提取并打印键和值对

  • 2

JSON:

"{
  "a": "https://is2-ssl.com/",
  "b": "https://a5.-ssl.com/",
  "type": "response",
  "c": [
    {
      "Number": 1,
      "Reportname": "XXX",
      "size": "2.5",
      "Variants": [
        "YYY"
      ]
    }
  ],
"Meta": "ABC"
}

所需输出:

XXX,a,https://is2-ssl.com/
XXX,b,https://a5.-ssl.com/

我想打印那些值包含“http”(url)的键值对,并将键和值与分隔符“,”合并,并将 ReportName 添加到它们

json jq
  • 1 个回答
  • 70 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve