다음을 출력하는 명령을 사용했습니다. .
"Credentials": {
"AccessKeyId": "ASIARKHY6",
"SecretAccessKey": "FHM11kEwWZ",
"SessionToken": "IQoJb3JpZ2luX2",
}
그런 다음 다음 3개의 키를 각각 내보내야 합니다. 이 작업을 수동으로 수행하고 있지만 스크립트로 작성하고 싶습니다.
명령 결과를 tmp 파일로 파이프한 다음 사용할 수 있습니다.
cat tmpfile.tmp |grep AccessKeyId
출력: "SecretAccessKey": "FHM11kEwW6sP3Z"
그렇다면 두 번째 "" 세트가 있는 텍스트만 어떻게 선택할 수 있습니까? 그러면 내보낼 수 있습니다.
답변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
위에 작성된 두 가지 형식 중 하나를 다음과 같이 스크립트(라고 부르겠습니다)에 넣는 것이 좋습니다 .
#!/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
입력이 최상위 키 중 하나로 키가 있는 잘 구성된 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_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"