我将文本文件的内容放入数组中,然后依次获取数组的元素并尝试将元素添加到 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')
需要使用变量来指定列表的索引。
.nodes[$count] += {"mac": $mac}
但在此变体中添加列表项不起作用。
那是因为当你对数组使用 += 时,RHS 必须是一个数组,如下所示:
.nodes[$count] += [{"mac": $mac}]
顺便说一句,我怀疑你可以通过使用 jq 完成所有(或至少几乎所有)所需的操作来极大地简化事情,从而避免 bash/awk/grep 的混乱。