bash - 如何遍历字典列表并根据 Bash 中的键对输出进行排序?

标签 bash ubuntu

我们从下面的字典格式列表中获取 API 调用的输出,

[
{
        "Key": "/builder-deployer/test2/services/serviceA/ip",
        "Val": "10.1.2.1"
    },
    {
        "Key": "/builder-deployer/test2/services/serviceA/port",
        "Val": "2"
    },
    {
        "Key": "/builder-deployer/test2/services/serviceA/url",
        "Val": "serviceA.abc.com"
    },
    {
        "Key": "/builder-deployer/test2/services/serviceA/username",
        "Val": "jenkins"
    },
    {
        "Key": "/builder-deployer/test2/services/serviceB/ip",
        "Val": "10.1.2.2"
    },
    {
        "Key": "/builder-deployer/test2/services/serviceB/port",
        "Val": "3"
    },
    {
        "Key": "/builder-deployer/test2/services/serviceB/url",
        "Val": "serviceB.abc.com"
    },
    {
        "Key": "/builder-deployer/test2/services/serviceB/username",
        "Val": "jenkins"
    },
    {
        "Key": "/builder-deployer/test2/services/serviceC/ip",
        "Val": "10.1.2.2"
    },
    {
        "Key": "/builder-deployer/test2/services/serviceC/port",
        "Val": "4"
    },
    {
        "Key": "/builder-deployer/test2/services/serviceC/url",
        "Val": "serviceC.abc.com"
    },
    {
        "Key": "/builder-deployer/test2/services/serviceC/username",
        "Val": "jenkins"
    }
]
我需要从列表中以 username@ip 的形式获取唯一的用户名和 IP 组合以安装一些依赖项。
即在上面的字典列表中,我们有 2 个唯一的 username@ip 组合。所以我需要在 上安装软件包 Jenkins @10.1.2.1 , Jenkins @10.1.2.2 机分别。
我在 python 脚本中有下面的代码,它做同样的事情,但我们的大部分代码都在 Bash 中,我们也想将它转换为 Bash。任何帮助都会非常有帮助
ip=[]
for username in outputs:
    for ip in outputs:
        if username['Key'].split('/')[-2] == ip['Key'].split('/')[-2] and username['Key'].split('/')[-1] in ['username'] and ip['Key'].split('/')[-1] in ['ip']:
            ip.append(username['Val']+'@'+ip['Val'])
print(set(ip))

最佳答案

jq

$ FILE="file.json"
$ paste -d@ \
        <(jq -r '.[]|select(.Key|contains("/username")).Val' "$FILE") \
        <(jq -r '.[]|select(.Key|contains("/ip")).Val' "$FILE") | \
        sort -u

jenkins@10.1.2.1
jenkins@10.1.2.2    
awk
awk -F\" '/\/ip/{getline;ip=$4}/username/{getline;$0=$4"@"ip;print|"sort -u"}' "$FILE"

jenkins@10.1.2.1
jenkins@10.1.2.2

关于bash - 如何遍历字典列表并根据 Bash 中的键对输出进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72389200/

相关文章:

linux - 我需要一个 shell 脚本来响应 json 200 ok 加上正文信息

linux - OpenJDK 运行时环境与 Java2 运行时环境

linux - 在 -lpcap 中找不到 pcap_open_live

java - 运行已编译的java程序的问题

linux - 如何获取长时间运行的 Linux 进程的启动时间?

bash - 无法启动 Redis 集群服务器

bash - sed 脚本 - 临时文件的权限被拒绝

linux - Git 推送到 master repo 然后将 dist 文件夹发送到特定路径(/www/site/v0.0.1)?

Radiant R 无法在 Shiny 的服务器上运行

kde-plasma - 双显示器不同分辨率