我使用了一个输出以下内容的命令。 。
"Credentials": {
"AccessKeyId": "ASIARKHY6",
"SecretAccessKey": "FHM11kEwWZ",
"SessionToken": "IQoJb3JpZ2luX2",
}
然后我必须导出以下 3 个键中的每一个。我正在手动执行此操作,但想编写脚本。
我可以将命令的结果通过管道传输到 tmp 文件中,然后使用
cat tmpfile.tmp |grep AccessKeyId
哪个输出:“SecretAccessKey”:“FHM11kEwW6sP3Z”
然后我怎样才能只选择带有第二组“”的文本。然后我可以导出。
答案1
假设您已将程序的输出存储到文件中tmpfile.tmp
,则可以仅使用命令将特定值提取到特定键sed
,如下所示,即使用“AccessKeyId”键:
key=AccessKeyId;
sed -n 's/^.*\"'$key'\":.*\"\(.*\)\".*$/\1/p' tmpfile.tmp
其输出ASIARKHY6
.您还可以直接将程序的输出通过管道传输到 sed,而无需创建临时文件,如下所示:
key=AccessKeyId;
./program | sed -n 's/^.*\"'$key'\":.*\"\(.*\)\".*$/\1/p'
我建议您将上面编写的两种形式之一放入脚本中(我们称之为getval.sh
),如下所示:
#!/bin/bash
if [ $# -lt 3 ];then echo "usage: $0 <inputfile> <key>"; exit 0 ;fi
infile=$1
key=$2
sed -n 's/^.*\"'$key'\":.*\"\(.*\)\".*$/\1/p' $infile
使其可执行后,您可以按如下方式运行:
./getval.sh tmpfile.tmp AccessKeyId
答案2
假设您运行的命令应输出凭证 JSON 输出。您可以使用jq
工具。
例如
creds_json=$(substitute the command which you used to output the credentials)
export AWS_ACCESS_KEY_ID=$(echo "$creds_json" | jq -r .credentials.accessKeyId)
export AWS_SECRET_ACCESS_KEY=$(echo "$creds_json" | jq -r .credentials.secretAccessKey)
export AWS_SESSION_TOKEN=$(echo "$creds_json" | jq -r .credentials.sessionToken)
答案3
假设您的输入是格式良好的 JSON 文档,其中一个Credentials
键作为顶级键之一:
{
"Otherinfo": "blah blah",
"Credentials": {
"AccessKeyId": "ASIARKHY6",
"SecretAccessKey": "FHM11kEwWZ",
"SessionToken": "IQoJb3JpZ2luX2",
"SecretStuff": "njahnjah"
}
}
然后,您可以使用类似的方法提取任何子键的值
eval "$(
jq -r '
$ARGS.positional[] as $key | @sh "export \($key)=\(.Credentials[$key])"' file \
--args AccessKeyId SecretAccessKey SessionToken
)"
使用上面的输入,这将生成并评估以下 shell 命令:
export 'AccessKeyId'='ASIARKHY6'
export 'SecretAccessKey'='FHM11kEwWZ'
export 'SessionToken'='IQoJb3JpZ2luX2'
您可以通过在表达式中使用$key|ascii_upcase
in 代替来获取大写变量名称。$key
jq
如果您从命令而不是文件中读取,则使用管道:
eval "$(
some-command |
jq -r '
$ARGS.positional[] as $key | @sh "export \($key|ascii_upcase)=\(.Credentials[$key])"' \
--args AccessKeyId SecretAccessKey SessionToken
)"
答案4
我假设您希望输出用双引号引起来。
使用sed
$ export AccessKeyId=$(sed -n s'/.*AccessKeyId[^"]*\("[^"]*"\).*/\1/p' input_file)
使用grep
$ export AccessKeyId=$(grep -Po '.*AccessKeyId[^"]*\K"[^"]*"' input_file)
使用awk
$ export AccessKeyId=$(awk -F": |," '/AccessKeyId/{print $2}' input_file)
输出
"ASIARKHY6"