我编写了以下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)
答案 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
}