如何从命令结果中导出“”内的文本

如何从命令结果中导出“”内的文本

我使用了一个输出以下内容的命令。 。

"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_upcasein 代替来获取大写变量名称。$keyjq

如果您从命令而不是文件中读取,则使用管道:

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"

相关内容