Groovy脚本调用Curl+Grep命令未过滤结果问题求助
问题:Groovy脚本中curl+grep管道命令未生效,输出完整响应
尝试运行Groovy脚本,期望通过curl请求后用grep过滤出包含DOCTYPE的内容,但脚本未输出过滤结果,反而打印了完整的curl响应。原脚本如下:
def print(){ def sout = new StringBuffer(), serr = new StringBuffer() def proc ='''curl --silent --request POST --header "content-type:application/json" www.google.co.in | grep DOCTYPE'''.execute() proc.consumeProcessOutput(sout, serr) proc.waitForOrKill(2000) println sout } print()
原因
Groovy的execute()方法默认不会启动系统shell解析命令,管道符|会被当作curl的参数传递,而非交给shell处理管道逻辑,因此grep并未实际执行过滤操作。
解决方案
方法1:通过系统shell执行完整命令
将整个命令交给系统shell(如/bin/sh)处理,让shell解析管道逻辑:
def print(){ def sout = new StringBuffer(), serr = new StringBuffer() // 用shell包裹完整命令 def proc = ['/bin/sh', '-c', '''curl --silent --request POST --header "content-type:application/json" www.google.co.in | grep DOCTYPE'''].execute() proc.consumeProcessOutput(sout, serr) proc.waitForOrKill(2000) println sout } print()
方法2:Groovy原生进程管道(跨平台推荐)
分开执行curl和grep两个进程,用Groovy的原生管道操作连接它们,无需依赖系统shell,兼容性更好:
def print(){ def sout = new StringBuffer(), serr = new StringBuffer() // 启动curl进程 def curlProc = '''curl --silent --request POST --header "content-type:application/json" www.google.co.in'''.execute() // 启动grep进程 def grepProc = 'grep DOCTYPE'.execute() // 将curl的输出管道到grep curlProc | grepProc grepProc.consumeProcessOutput(sout, serr) grepProc.waitForOrKill(2000) println sout } print()
两种方法都能实现和Linux终端执行相同的过滤效果,方法2更适合跨平台场景(如Windows系统)。
内容的提问来源于stack exchange,提问作者Mofis Khan
相关产品推荐
相关产品推荐

