使用 sed 或 jq 删除动态生成的 JSON 数组中的最后一个 `},`
Remove last `},` in a dynamically generated JSON array using sed or jq
我正在尝试动态生成 JSON,但是,我遵循的方法留下了最后一个 },
,使 JSON 无效:
#Initializing Current State file
echo "[" > state.json
# Getting list of all EKS clusters
for cluster in $(aws eks list-clusters --output text | awk '{print }')
do
echo "====== $cluster ======"
# Get list of all ASG from cluster
for asg in $(aws autoscaling describe-auto-scaling-groups --query 'AutoScalingGroups[?contains(Tags[?Key==`eks:cluster-name`].Value, `'"$cluster"'`)].[AutoScalingGroupName]' --output text)
do
echo "Getting capacity for ASG: $asg"
MinSize=$(aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name $asg --query 'AutoScalingGroups[*].MinSize' --output text)
DesiredCapacity=$(aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name $asg --query 'AutoScalingGroups[*].DesiredCapacity' --output text)
MaxSize=$(aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name $asg --query 'AutoScalingGroups[*].MaxSize' --output text)
JSON_STRING=$( jq -n \
--arg cn "$cluster" \
--arg asg "$asg" \
--arg MinSize "$MinSize" \
--arg DesiredCapacity "$DesiredCapacity" \
--arg MaxSize "$MaxSize" \
'{cluster: $cn, asgname: $asg, minSize: $MinSize, DesiredCapacity: $DesiredCapacity, MaxSize: $MaxSize}' )
echo "${JSON_STRING}," >> state.json
done
done
#Finalizing Current State file
echo "]" >> state.json
$ cat state.json
[
{
"cluster": "eks-b",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "eks-b",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "dev",
"asgname": "eks-12345",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "dev",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "eks-a",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "eks-a",
"asgname": "eks-1323",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
]
jq
验证:
$ cat state.json | jq empty
parse error: Expected another array element at line 44, column 1
我尝试了多种选择,主要是 sed
,但没有满足仅删除最后一次出现的 },
的特定要求
任何建议表示赞赏。
通过不打印括号和逗号,让您的脚本只生成对象流。
echo "${JSON_STRING}" >> state.json
state.json
应该包含一个对象流:
{
"cluster": "eks-b",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
}
{
"cluster": "eks-b",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
}
{
"cluster": "dev",
"asgname": "eks-12345",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
}
{
"cluster": "dev",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
}
{
"cluster": "eks-a",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
}
{
"cluster": "eks-a",
"asgname": "eks-1323",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
}
现在您可以使用 jq 读取该流,使用 -s
选项将其转换为适当的数组。
jq -s . state.json
[
{
"cluster": "eks-b",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "eks-b",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "dev",
"asgname": "eks-12345",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "dev",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "eks-a",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "eks-a",
"asgname": "eks-1323",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
}
]
Demo jq -s
部分
如果您不需要最终结果是 pretty-printed,您可以通过删除多余的逗号来节省调用 jq -s
的费用,例如
sed '$s/,$//'
或者如果您愿意:
sed -i.bak '$s/,$//'
更好的是,您可以避免在同一步骤中处理终止符“]”,例如使用 '$s/,$/]/'
我正在尝试动态生成 JSON,但是,我遵循的方法留下了最后一个 },
,使 JSON 无效:
#Initializing Current State file
echo "[" > state.json
# Getting list of all EKS clusters
for cluster in $(aws eks list-clusters --output text | awk '{print }')
do
echo "====== $cluster ======"
# Get list of all ASG from cluster
for asg in $(aws autoscaling describe-auto-scaling-groups --query 'AutoScalingGroups[?contains(Tags[?Key==`eks:cluster-name`].Value, `'"$cluster"'`)].[AutoScalingGroupName]' --output text)
do
echo "Getting capacity for ASG: $asg"
MinSize=$(aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name $asg --query 'AutoScalingGroups[*].MinSize' --output text)
DesiredCapacity=$(aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name $asg --query 'AutoScalingGroups[*].DesiredCapacity' --output text)
MaxSize=$(aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name $asg --query 'AutoScalingGroups[*].MaxSize' --output text)
JSON_STRING=$( jq -n \
--arg cn "$cluster" \
--arg asg "$asg" \
--arg MinSize "$MinSize" \
--arg DesiredCapacity "$DesiredCapacity" \
--arg MaxSize "$MaxSize" \
'{cluster: $cn, asgname: $asg, minSize: $MinSize, DesiredCapacity: $DesiredCapacity, MaxSize: $MaxSize}' )
echo "${JSON_STRING}," >> state.json
done
done
#Finalizing Current State file
echo "]" >> state.json
$ cat state.json
[
{
"cluster": "eks-b",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "eks-b",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "dev",
"asgname": "eks-12345",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "dev",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "eks-a",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "eks-a",
"asgname": "eks-1323",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
]
jq
验证:
$ cat state.json | jq empty
parse error: Expected another array element at line 44, column 1
我尝试了多种选择,主要是 sed
,但没有满足仅删除最后一次出现的 },
的特定要求
任何建议表示赞赏。
通过不打印括号和逗号,让您的脚本只生成对象流。
echo "${JSON_STRING}" >> state.json
state.json
应该包含一个对象流:
{
"cluster": "eks-b",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
}
{
"cluster": "eks-b",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
}
{
"cluster": "dev",
"asgname": "eks-12345",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
}
{
"cluster": "dev",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
}
{
"cluster": "eks-a",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
}
{
"cluster": "eks-a",
"asgname": "eks-1323",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
}
现在您可以使用 jq 读取该流,使用 -s
选项将其转换为适当的数组。
jq -s . state.json
[
{
"cluster": "eks-b",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "eks-b",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "dev",
"asgname": "eks-12345",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "dev",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "eks-a",
"asgname": "eks-1234",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
},
{
"cluster": "eks-a",
"asgname": "eks-1323",
"minSize": "0",
"DesiredCapacity": "0",
"MaxSize": "0"
}
]
Demo jq -s
部分
如果您不需要最终结果是 pretty-printed,您可以通过删除多余的逗号来节省调用 jq -s
的费用,例如
sed '$s/,$//'
或者如果您愿意:
sed -i.bak '$s/,$//'
更好的是,您可以避免在同一步骤中处理终止符“]”,例如使用 '$s/,$/]/'