【问题标题】:Combine sed commands into one command in bash script在 bash 脚本中将 sed 命令合并为一个命令
【发布时间】:2018-10-29 20:57:22
【问题描述】:

我想改进这一行:

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

【问题讨论】:

  • 为了提高效率,在sed 调用之前执行grep tdunphy。您也可以将sed 's/"//g'| sed 's/,//g' 更改为sed 's/[,"]//g'
  • 您也可以使用-r 选项将其缩减为一个sedsed -r 's/arn:aws:iam::832839043616:user\/|,|"//g'
  • 另见stackoverflow.com/questions/7657647/combining-2-sed-commands;简而言之,sed "s/[\"']//g"

标签: bash sed jq


【解决方案1】:

这可以在 single 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

【讨论】:

  • endswith() 而不是 contains() 也许?
  • 是的,endswith 在这里肯定会更好,我刚刚翻译了grep :) 但现在已修复。
  • 谢谢!这是一个很好的解决方案。但是我确实需要“消除”最后一部分:arn:aws:iam::123456789101:user/。这是我正在使用的命令:aws iam get-role --role-name "$aws_role_name" --profile="$aws_key" | jq --arg u "tdunphy" -r '.Role.AssumeRolePolicyDocument.Statement[].Principal.AWS[] | select(. | endswith($u))' | sed "s/arn:aws:iam::123456789101:user\///g"
  • 哦,好的,这也可以在jq 中处理,但不会给出与您在$u 中传递的字符串相同的字符串,即tdumphy
  • 没有sed你可以这样做:jq --arg u 'tdunphy' -r ' .Role.AssumeRolePolicyDocument.Statement[].Principal.AWS[] | select(. | endswith($u)) | sub("arn:aws:iam::123456789101:user/"; "")'
【解决方案2】:

如果你真的想要,这结合了所有 sedgrep 行的功能:

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

这是否算作改进在某种程度上是旁观者的看法。

【讨论】:

    【解决方案3】:

    将您的呼叫更改为 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"))[]'
    

    【讨论】:

    • 谢谢!这确实让我大部分时间都在那里。不过,我仍然需要去掉这一点:arn:aws:iam::123456789101:user/。这条线似乎用更少的 sed 来做到这一点:aws iam get-role --role-name rl-ksr --profile=company-bill | jq -r '.Role.AssumeRolePolicyDocument.Statement[].Principal.AWS[]' | grep tdunphy | sed "s/arn:aws:iam::123456789101:user\///g" | grep tdunphy
    【解决方案4】:

    你可以这样做

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

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

    【讨论】:

    • tr -d ',"'
    【解决方案5】:

    替换

    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
         '
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 2021-07-20
      相关资源
      最近更新 更多