繁体   English   中英

在bash脚本中将sed命令合并为一个命令

[英]Combine sed commands into one command in bash script

我想改善这一行:

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语句?

这样可以在单个jq命令中完成,这样可以避免调用多个外部命令,例如grepsed等:

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

如果您确实愿意,这可以结合您所有sedgrep行的功能:

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

在旁观者看来,这是否算是一种改进。

更改对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"))[]'

你可以做

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

而不是两个sed(如果只是一个字)

更换

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
     '

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM