Объедините команды sed в одну команду в скрипте bash - PullRequest
0 голосов
/ 29 октября 2018

Я бы хотел улучшить эту строку:

aws_iam_role=$(aws iam get-role --role-name rl-company-admin --profile=company-bill |
jq -r '.Role.AssumeRolePolicyDocument.Statement[].Principal.AWS' |
sed "s/arn:aws:iam::123456789101:user\///g" |
grep tdunphy |
sed 's/"//g'|
sed 's/,//g')

Это необработанный вывод команды без обработки:

aws iam get-role --role-name rl-company-admin --profile=company-bill
{
    "Role": {
        "Description": "company Admin Role", 
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17", 
            "Statement": [
                {
                    "Action": "sts:AssumeRole", 
                    "Effect": "Allow", 
                    "Principal": {
                        "AWS": [
                            "arn:aws:iam::123456789101:user/tdunphy", 
                            "arn:aws:iam::123456789101:user/user1", 
                            "arn:aws:iam::123456789101:user/user2", 
                            "arn:aws:iam::123456789101:user/user3", 
                        ]
                    }
                }
            ]
        }, 
        "MaxSessionDuration": 3600, 
        "RoleId": "AROAJGNAT3IXV7DIWSDCK", 
        "CreateDate": "2018-01-18T17:35:27Z", 
        "RoleName": "rl-company-admin", 
        "Path": "/", 
        "Arn": "arn:aws:iam::188087670762:role/rl-company-admin"
    }
}

Как использовать один оператор sed для обработки этого текста вместо нескольких операторов sed?

Ответы [ 5 ]

0 голосов
/ 30 октября 2018

Это можно сделать с помощью команды single jq следующим образом, избегая вызова нескольких внешних команд, например, grep, sed и т. Д .:

aws iam get-role --role-name rl-company-admin --profile=company-bill |
jq --arg u 'tdunphy' -r '
 .Role.AssumeRolePolicyDocument.Statement[].Principal.AWS[] |
 select(. | endswith($u)) | sub("arn:aws:iam::123456789101:user/"; "")'

Выход:

tdunphy
0 голосов
/ 30 октября 2018

Заменить

sed "s/arn:aws:iam::123456789101:user\///g" |
grep tdunphy |
sed 's/"//g'|
sed 's/,//g'

с

sed -n '/tdunphy/ {
        s/arn:aws:iam::123456789101:user\///g
        s/[,"]//g
        p
     '
0 голосов
/ 30 октября 2018

Если вы действительно хотите, это объединяет функциональность всех ваших sed и grep строк:

sed -n 's/arn:aws:iam::123456789101:user\///g; s/[,"]//g; /tdunphy/ {p}'

Считается ли это улучшением в глазах смотрящего.

0 голосов
/ 30 октября 2018

Измените свой вызов на jq, чтобы он выглядел следующим образом, и тогда вам не придется лишать других символов:

jq -r '.Role.AssumeRolePolicyDocument.Statement[].Principal.AWS[]'
                                                               ^^ Add these

Вы можете попробовать это также:

aws iam get-role --role-name rl-company-admin --profile=company-bill | \
  jq -r '.Role.AssumeRolePolicyDocument.Statement[].Principal.AWS[] | split("/") | last' | \
  grep tdunphy

Это может быть немного кратко, но вы можете сделать все это одним вызовом jq:

jq -r '[.Role.AssumeRolePolicyDocument.Statement[].Principal.AWS[] | split("/") | last] | map(select(. == "tdunphy"))[]'
0 голосов
/ 30 октября 2018

Вы могли бы сделать

sed 's/[,"]//g' 

вместо двух слов (если это даже слово)

...