如何对数组中的元素进行排序或只打印它们?

时间:2017-12-14 09:12:45

标签: groovy aws-cli

我编写了以下Groovy代码,该代码返回我们使用的所有3个AWS区域中使用的CIDR块数组,结果填充到Jenkins扩展参数:

def regions = ['us-west-2', 'us-east-1', 'eu-west-1']
        def output = []
        regions.each { region ->
            def p = ['/usr/local/bin/aws', 'ec2', 'describe-vpcs', '--region', region].execute() | 'grep -w CidrBlock'.execute() | ['awk', '{print $2}'].execute() | ['tr', '-d', '"\\"\\|,\\|\\{\\|\\\\["'].execute() | 'uniq'.execute()
            p.waitFor()
            p.text.eachLine { line ->
                output << line
            }
        }
        output.each {
            println it
        }

代码的输出如下:

172.31.0.0/16
172.56.0.0/16
172.55.0.0/16
172.64.0.0/16
172.52.0.0/16

我想以数字方式对输出进行排序,是否可以完成?

编辑#1:

如果我使用&#34; .sort()&#34;我收到以下错误:

Caught: groovy.lang.MissingMethodException: No signature of method: java.lang.String.sort() is applicable for argument types: () values: []
Possible solutions: drop(int), tr(java.lang.CharSequence, java.lang.CharSequence), wait(), toSet(), size(), size()
groovy.lang.MissingMethodException: No signature of method: java.lang.String.sort() is applicable for argument types: () values: []
Possible solutions: drop(int), tr(java.lang.CharSequence, java.lang.CharSequence), wait(), toSet(), size(), size()
    at populate_parameter_with_used_cidrs$_run_closure2.doCall(populate_parameter_with_used_cidrs.groovy:15)
    at populate_parameter_with_used_cidrs.run(populate_parameter_with_used_cidrs.groovy:14)

3 个答案:

答案 0 :(得分:1)

.sort()怎么样?

def list = ['172.31.0.0/16', '172.56.0.0/16', '172.55.0.0/16', '172.64.0.0/16', '172.52.0.0/16']
println list.sort()

答案 1 :(得分:1)

首先对代码提供一些常规提示:

如果你执行p.waitFor(),则不需要

p.text,因为这等待过程首先完成。

要获取多行String行的String列表,您只需使用readLines()

要将一个列表转换为另一个列表,您可以使用collect()collectMany()

这会将您的代码归结为

def regions = ['us-west-2', 'us-east-1', 'eu-west-1']
def output = regions.collectMany { ['/usr/local/bin/aws', 'ec2', 'describe-vpcs', '--region', it].execute() | 'grep -w CidrBlock'.execute() | ['awk', '{print $2}'].execute() | ['tr', '-d', '"\\"\\|,\\|\\{\\|\\\\["'].execute() | 'uniq'.execute().text.readLines() }
output.each { println it }

要获得数字感知排序,请添加

output = output.sort { a, b ->
    def aparts = a.split('[./]').collect { it as short }
    def bparts = b.split('[./]').collect { it as short }
    (0..4).collect { aparts[it] <=> bparts[it] }.find() ?: 0
}

答案 2 :(得分:0)

作为选项:排序和删除重复项

(output as SortedSet).each {
            println it
        }