명령 결과에서 "" 내부의 텍스트를 내보내는 방법

명령 결과에서 "" 내부의 텍스트를 내보내는 방법

다음을 출력하는 명령을 사용했습니다. .

"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_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"

관련 정보