コマンドの結果から「」内のテキストをエクスポートする方法

コマンドの結果から「」内のテキストをエクスポートする方法

以下を出力するコマンドを使用しました。 。

"Credentials": {
        "AccessKeyId": "ASIARKHY6",
        "SecretAccessKey": "FHM11kEwWZ",
        "SessionToken": "IQoJb3JpZ2luX2",
}

次に、次の3つのキーをそれぞれエクスポートする必要があります。私はこれを手動で実行していますが、スクリプトで書くのが好きです。

コマンドの結果をtmpファイルにパイプして使用できます。

cat tmpfile.tmp |grep  AccessKeyId 

出力: "SecretAccessKey": "FHM11kEwW6sP3Z"

それでは、2番目の「」セットを持つテキストだけをどのように選択できますか?これでエクスポートできます。

答え1

プログラムの出力をファイルに保存したと仮定すると、次のように "AccessKeyId"キーを使用してtmpfile.tmpコマンドを使用して、特定のキーに特定の値を抽出できます。sed

key=AccessKeyId;
sed -n 's/^.*\"'$key'\":.*\"\(.*\)\".*$/\1/p' tmpfile.tmp

ASIARKHY6次のように一時ファイルを作成せずに、プログラムの出力をsedに直接パイプすることもできます。

key=AccessKeyId;
./program | sed -n 's/^.*\"'$key'\":.*\"\(.*\)\".*$/\1/p'

getval.sh上記の2つの形式のいずれかを次のようにスクリプト(と呼びます)に入れることをお勧めします。

#!/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

Credentials入力が最上位キーの1つとしてキーを持つよく構成されたJSONドキュメントであるとします。

{
  "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
)"

上記の入力を使用すると、次のシェルコマンドが生成され評価されます。

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"

関連情報