С在 bash 脚本中使用 jq 实用程序创建多级 json

问题描述 投票:0回答:1

我将文本文件的内容放入数组中,然后依次获取数组的元素并尝试将元素添加到 json 中:

#!/bin/bash

JSON=$(jq -n '')
readarray -t array < ./station.sample
count=0

for e in "${array[@]}"
do
    if echo "$e" | grep -Eq '^[0-9]{10}' >/dev/null
      then
        timestamp=$e
        datetime=`date +'%Y-%m-%d %H:%M:%S' -d "@$e"`
        JSON=$(echo $JSON | jq --arg timestamp "${timestamp}" '. += $ARGS.named')
        JSON=$(echo $JSON | jq --arg datetime "${datetime}" '. += $ARGS.named')
    fi

    if echo "$e" | grep '^Station ' >/dev/null
      then
        NODE=$(jq -n '')
        mac=`echo "$e" | awk '{ print $2 }'`
        interface=`echo "$e" | awk '{ print $4 }' | rev | cut -c2- | rev`

        JSON=$(echo $JSON | jq --argjson nodes "[]" '. += $ARGS.named')
        JSON=$(echo $JSON | jq --arg mac "${mac}" --arg count "${count}" '.nodes[0] += {"mac": $mac}')
    JSON=$(echo $JSON | jq --arg interface "${interface}" '.nodes[0] += {"interface": $interface}')

        count=$((count+1))
    fi
done

结果,我得到了这样的json:

{
  "timestamp": "1721396365",
  "datetime": "2024-07-19 16:39:25",
  "nodes": [
    {
      "mac": "14:88:00:00:00:06"
    }
  ]
}

但是我需要将多个对象添加到列表中,因此我设置了一个计数变量并想用它来指定列表的索引:

JSON=$(echo $JSON | jq --arg mac "${mac}" --arg count "${count}" '.nodes[$count] += {"mac": $mac}')

但是在此变体中添加列表项不起作用。

如何动态指定列表的索引?

我已经尝试了想到的所有选项,但我还没有找到解决方案:

 NODE=$(echo $NODE | jq --arg mac "$mac" '. += $ARGS.named')
 NODE=$(echo $NODE | jq --arg interface "${interface}" '. += $ARGS.named')
 JSON=$(echo $JSON | jq --argjson node "${NODE}" '.nodes[.nodes | length] = $ARGS.named')

需要使用变量来指定列表的索引。

json bash jq
1个回答
0
投票

.nodes[$count] += {"mac": $mac}

但在此变体中添加列表项不起作用。

那是因为当你对数组使用 += 时,RHS 必须是一个数组,如下所示:

 .nodes[$count] += [{"mac": $mac}]

顺便说一句,我怀疑你可以通过使用 jq 完成所有(或至少几乎所有)所需的操作来极大地简化事情,从而避免 bash/awk/grep 的混乱。

© www.soinside.com 2019 - 2024. All rights reserved.