2017-10-13 93 views
1

是否可以对json文档的特定数组进行排序,然后输出带有排序内容的整个文档,否则不会被触动?输出带有排序内容的整个JSON文档

举例来说,如果我有这样的事情:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Sid": "BLAHBLAHBLAH", 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": [ 
      "arn:aws:iam::346654243625:root", 
      "arn:aws:iam::984895836564:root", 
      "arn:aws:iam::636877599363:root", 
      "arn:aws:iam::577836285792:root", 
      "arn:aws:iam::836666644595:root", 
      "arn:aws:iam::652379234777:root", 
      "arn:aws:iam::339659563489:root", 
      "arn:aws:iam::293576423935:root", 
      "arn:aws:iam::682354689262:root", 
      "arn:aws:iam::349855857558:root", 
      "arn:aws:iam::398259495958:root", 
      "arn:aws:iam::735277384553:root" 
     ] 
     }, 
     "Action": "s3:*", 
     "Resource": [ 
     "arn:aws:s3:::blah-blah-blah", 
     "arn:aws:s3:::blah-blah-blah/*" 
     ] 
    } 
    ] 
} 

我想找回这一点:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Sid": "BLAHBLAHBLAH", 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": [ 
      "arn:aws:iam::293576423935:root", 
      "arn:aws:iam::339659563489:root", 
      "arn:aws:iam::346654243625:root", 
      "arn:aws:iam::349855857558:root", 
      "arn:aws:iam::398259495958:root", 
      "arn:aws:iam::577836285792:root", 
      "arn:aws:iam::636877599363:root", 
      "arn:aws:iam::652379234777:root", 
      "arn:aws:iam::682354689262:root", 
      "arn:aws:iam::735277384553:root", 
      "arn:aws:iam::836666644595:root", 
      "arn:aws:iam::984895836564:root" 
     ] 
     }, 
     "Action": "s3:*", 
     "Resource": [ 
     "arn:aws:s3:::blah-blah-blah", 
     "arn:aws:s3:::blah-blah-blah/*" 
     ] 
    } 
    ] 
} 

我已经看到了使用jqJMESPath排序的例子,但仅见过他们输出正在排序的部分,而不是整个文档与已排序的部分。寻找有关此事的指导,并对任何工作解决方案感到满意。

这是我用来对数组| jq '.Statement[].Principal.AWS|sort'进行排序的工作,但我想回到整个文档格式化的上下文中。

回答

3

这对JQ处理器的工作:

jq '.Statement[0].Principal.AWS |= sort' file 
  • .Statement[0].Principal.AWS - 所选项目

  • |= - 更新声明/行动(更新所选项目)


输出:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Sid": "BLAHBLAHBLAH", 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": [ 
      "arn:aws:iam::293576423935:root", 
      "arn:aws:iam::339659563489:root", 
      "arn:aws:iam::346654243625:root", 
      "arn:aws:iam::349855857558:root", 
      "arn:aws:iam::398259495958:root", 
      "arn:aws:iam::577836285792:root", 
      "arn:aws:iam::636877599363:root", 
      "arn:aws:iam::652379234777:root", 
      "arn:aws:iam::682354689262:root", 
      "arn:aws:iam::735277384553:root", 
      "arn:aws:iam::836666644595:root", 
      "arn:aws:iam::984895836564:root" 
     ] 
     }, 
     "Action": "s3:*", 
     "Resource": [ 
     "arn:aws:s3:::blah-blah-blah", 
     "arn:aws:s3:::blah-blah-blah/*" 
     ] 
    } 
    ] 
} 

排序多个阵列使用:

jq '.Statement[].Principal.AWS |= sort' file 
+0

太棒了!这确实有效,你是否打算分解它并解释这实际上是如何完成的? – TryTryAgain

+1

@TryTryAgain,当然,请参阅我的解释 – RomanPerekhrest

+2

几条评论:1.您不必将其限制为第一条语句,您可以将其保留为'.Statement []。Principal ...',2. the当不需要排序时最初的'。',它可能只是'排序'。 '.Statement []。Principal.AWS | = sort' –