在Bash中提取类JSON变量的值

3

我在bash中有一个变量,它是Amazon EMR create命令的输出;

CLUSTER=$(aws emr create-cluster ...)
echo $CLUSTER

输出结果如下:
{ "ClusterId": "j-9YWMBYN98LN7" }

我需要做的是将值j-9YWMBYN98LN7提取到一个新变量中,类似于:

ID=$CLUSTER.(ClusterId)

当然,上述命令是无效的。我已经尝试使用jq,但没有成功。
ID=$(jq -r '.ClusterId' $CLUSTER)

事实上,我甚至不确定$CLUSTER是什么类型。我该如何提取那里的值j-9YWMBYN98LN7?谢谢。


如果可能并不重要,但是你尝试过使用双引号括起来的 ID=$(jq -r '.ClusterId' "$CLUSTER") 吗?祝好运。 - shellter
还是不行,这是输出结果:jq: { "ClusterId": "j-1FZMHAPPDD0LG" }: 没有那个文件或目录。 不管怎样还是谢谢。 - user3685928
3个回答

13

如果你想使用 jq,可以按照以下方式实现

 ID=`echo ${CLUSTER} | jq -r '.ClusterId'`

1
谢谢,但这个也不行。我认为这个$CLUSTER不是json格式(可能是字符串,我不知道)。以下是输出内容:“cat: {: 没有那个文件或目录 cat: "ClusterId":: 没有那个文件或目录 cat: "j-1FZMHAPPDD0LG": 没有那个文件或目录 cat: }: 没有那个文件或目录” - user3685928
我的错,应该使用 echo 而不是 cat。我已经更正了我的答案,现在应该可以工作了。 - CS Pei
现在它可以工作了,非常感谢,但是我只能给你的答案点赞,因为我已经接受了另一个答案 :) - user3685928
@user3685928 你可以(而且应该)接受这个答案。 - chepner
简单易用 ✨ - Rizki Noor Hidayat Wijaya

5

如果

echo $CLUSTER

提供给您
{ "ClusterId": "j-9YWMBYN98LN7" }

那么

ID=$(awk  'BEGIN{FS="\""}{print $4}' <<< "${CLUSTER}")

应该这样做。
echo "$ID"
j-9YWMBYN98LN7

这个有效。非常感谢! - user3685928
@user3685928:不客气,伙计! - sjsam
2
这个解决方案在bash中有效,但在其他shell中无效。这是我对ash的变化:ID=$(echo $CLUSTER | awk 'BEGIN{FS="\""}{print $4}') - Javier Yáñez
@JavierYáñez 很好,谢天谢地这个问题被标记为bash。 - sjsam

2
请尝试以下方法:
ID=$(echo "${CLUSTER}" | sed 's/{ "ClusterId": "//' | sed 's/" }//')

这将会把最后一组引号中的 j-9YWMBYN98LN7,或者其他类似的内容,赋值给变量 $ID

我感觉你需要更多的内容,因为你可能计划使用 $ID 的内容,并且可能有更有效的方法来获取该值。如果你能解释一下你打算如何使用该值,我们可以提供更具体的答案。


我正在编写一个脚本来自动化创建EMR集群并向其中添加任务的过程。在任务添加步骤中,我需要此集群的ID,例如:aws emr add-steps --cluster-id $ID。但我不确定这个变量$ ID的类型,并且我知道仅凭提供输出可能很难确定。 - user3685928
无论如何,您的命令输出仍然与$CLUSTER相同{ "ClusterId": "j-1FZMHAPPDD0LG" } - user3685928
很奇怪它对你不起作用。您可以通过echo '{ "ClusterId": "j-9YWMBYN98LN7" }' | sed 's/{ "ClusterId": "//' | sed 's/" }//'进行检查。对我来说,它确实输出了j-9YWMBYN98LN7。不过没关系,我也更喜欢@sjsam的awk答案。 - John Mark Mitchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接