如何从shell脚本中较长的混合字符串中提取JSON字符串

如何从shell脚本中较长的混合字符串中提取JSON字符串,json,shell,awk,sed,Json,Shell,Awk,Sed,给定以下字符串: arn:aws:secretsmanager:us-east-1:3264873466873:secret:foo/bar 1564681234.974 foo/bar {"username":"admin","password":"admin123","secret_key":"KASJDFJHAKHFKAHASDF"} 4e397333-3797-4f0b-ad7e-8c1cc0ed041c VERSIONSTAGES AWSCURRENT 在shell脚本中,如何仅提取

给定以下字符串:

arn:aws:secretsmanager:us-east-1:3264873466873:secret:foo/bar 1564681234.974 foo/bar {"username":"admin","password":"admin123","secret_key":"KASJDFJHAKHFKAHASDF"} 4e397333-3797-4f0b-ad7e-8c1cc0ed041c VERSIONSTAGES AWSCURRENT
在shell脚本中,如何仅提取JSON部分以如下方式结束:

{"username":"admin","password":"admin123","secret_key":"KASJDFJHAKHFKAHASDF"}
我可以使用两个sed命令来执行此操作:

echo $longString | sed 's/^.*{/{/' | sed 's/}.*$/}/'

但我想知道是否有一种方法可以只使用一个命令来完成此操作。

要提取列,请使用
awk

echo $longString | awk '{print $4}'
cut

echo $longString | cut -f 4 -d ' ' 

如果JSON数据中有空格,请小心。您最好使用
jq
来处理
aws secretsmanager list secrets
和类似内容的结果。

要提取列,请使用
awk

echo $longString | awk '{print $4}'
cut

echo $longString | cut -f 4 -d ' ' 
如果JSON数据中有空格,请小心。您最好使用
jq
来处理
aws secretsmanager列表机密
和类似内容的结果。

您可以使用

echo $longString | sed -n 's|.*\({.*}\).*|\1|p'
要匹配并打印所需图案,可以使用

echo $longString | sed -n 's|.*\({.*}\).*|\1|p'

要匹配并打印所需的图案

,只需将sed命令加入到单个命令中即可
sed的/^.*{/{;s/}.*$/}/'

您可以将sed命令连接到单个命令
sed的/^.*{/{;s/}.*$/}/'
要提取输入的连续部分,您可以使用
grep
及其
-o
选项(如果您的系统支持)。它告诉grep只输出匹配的部分

grep -o '{.*}'

要提取输入的连续部分,您可以使用
grep
及其
-o
选项(如果您的系统支持)。它告诉grep只输出匹配的部分

grep -o '{.*}'

这个
awk
应该可以。我将处理字符串中是否有空格

echo $string | awk -F"[{}]" '{print $2}'
"username":"admin","password":"admin123","secret_key":"KASJDFJHAKHFKAHASDF"

这个
awk
应该可以。我将处理字符串中是否有空格

echo $string | awk -F"[{}]" '{print $2}'
"username":"admin","password":"admin123","secret_key":"KASJDFJHAKHFKAHASDF"

grep-o'{.*}'
maybe?
grep-o'{.*}'
maybe?