使用“|”执行 aws 命令时未在 Groovy 中获得输出和 "sed"

Not getting output in Groovy when execute aws command with "|" and "sed"

我正在使用 Jenkins 的 Active 选择参数来填充 RDS 实例类型列表

我是 groovy 的新手,正在尝试使用 sed 从 groovy 脚本中获取 aws cli 的值。

下面的代码工作正常,但是由于有多个许可选项,它给出了重复的条目

def command = "aws rds describe-orderable-db-instance-options --engine mysql --engine-version 8.0.20 --query OrderableDBInstanceOptions[*].DBInstanceClass --output text"
def proc = command.execute()
proc.waitFor()
def instances = proc.in.text.readLines()
return instances

为了删除重复的条目,我厌倦了下面的代码,但它不会显示任何输出

第一次尝试

def command = "aws rds describe-orderable-db-instance-options --engine mysql --engine-version 8.0.20 --query OrderableDBInstanceOptions[*].DBInstanceClass --output text | sed -e 'y/\t/\n/' | sort -u"
def proc = command.execute()
proc.waitFor()
def instances = proc.in.text.readLines()
return instances

第二次尝试

def command = """
aws rds describe-orderable-db-instance-options --engine mysql --engine-version 8.0.20 --query OrderableDBInstanceOptions[*].DBInstanceClass --output text | sed -e 'y/\t/\n/' | sort -u
"""
def proc = ['bash', '-c', command].execute()
proc.waitFor()
def instances = proc.in.text.readLines()
return instances

A上面的代码给出了以下错误

java.io.IOException: Cannot run program "sh": CreateProcess error=2, The system cannot find the file specified

    at ConsoleScript18.run(ConsoleScript18:9)

Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified

第三次尝试

def  module = sh(script: """aws rds describe-orderable-db-instance-options --engine mysql --engine-version 8.0.20 --query OrderableDBInstanceOptions[*].DBInstanceClass --output text | sed -e 'y/\t/\n/' | sort -u """,returnStdout: true).trim()
echo "${module}"

给出以下错误

groovy.lang.MissingMethodException: No signature of method: ConsoleScript26.sh() is applicable for argument types: (LinkedHashMap) values: [[script:aws rds describe-orderable-db-instance-options --engine mysql --engine-version 8.0.20 --query OrderableDBInstanceOptions[*].DBInstanceClass --output text | sed -e 'y/  /
/' | sort -u , ...]]
Possible solutions: is(java.lang.Object), use([Ljava.lang.Object;), NV([Ljava.lang.Object;), run(), run(), any()

非常感谢对此的帮助。

我花了很多时间才解决的。

首先,我尝试使用普通的 bash 实用程序(即 sed)以删除重复项,但是很难与 groovy 一起使用。

因此使用 groovy 的 unique 功能将其删除。

下面是 Jenkin 的 Active 选择参数 插件的工作代码。所以如果有人遇到这类问题可以使用它。

def cmd = "aws rds describe-orderable-db-instance-options --engine mysql --engine-version 8.0.20 --query [OrderableDBInstanceOptions[*].DBInstanceClass] --output text"
def output = cmd.execute()
output.waitFor()
def error = output.err.text
def instances = output.text.tokenize().toUnique()
if (error) {
    return [error]
} else {
    return instances
}