使用groovy,你如何管道多个shell命令?

时间:2016-02-03 20:33:26

标签: bash shell groovy process

使用Groovy及其java.lang.Process支持,如何将多个shell命令一起管道?

考虑这个bash命令(并假设您的用户名为foo):

ps aux | grep ' foo' | awk '{print $1}'

这将打印出用户名 - 与您的用户帐户相关的某些进程的一行。

使用Groovy,ProcessGroovyMethods文档和代码说我应该能够做到这一点来实现相同的结果:

def p = "ps aux".execute() | "grep ' foo'".execute() | "awk '{print $1}'".execute()
p.waitFor()
println p.text

但是,我无法获得除此之外的任何文本输出:

def p = "ps aux".execute()
p.waitFor()
println p.text

一旦开始配管,println就不会打印出任何东西。

思想?

4 个答案:

答案 0 :(得分:15)

这对我有用:

def p = 'ps aux'.execute() | 'grep foo'.execute() | ['awk', '{ print $1 }'].execute()
p.waitFor()
println p.text

由于未知原因,awk的参数只能用一个字符串发送(我不知道为什么!也许bash引用不同的东西)。如果使用命令转储错误流,则会看到与awk脚本编译相关的错误。

修改:事实上,

  1. "-string-".execute()委托给Runtime.getRuntime().exec(-string-)
  2. 使用'来处理包含空格的参数的bash作业或"。 Runtime.exec或操作系统不知道引号
  3. 执行"grep ' foo'".execute()执行命令grep,第一个参数为',第二个参数为foo':它无效。同样适用于awk

答案 1 :(得分:11)

你可以这样做,让shell对其进行排序:

// slash string at the end so we don't need to escape ' or $
def p = ['/bin/bash', '-c', /ps aux | grep ' foo' | awk '{print $1}'/].execute()
p.waitFor()
println p.text

答案 2 :(得分:3)

这对我有用

def command = '''
    ps aux | grep bash | awk '{print $1}'
'''
def proc = ['bash', '-c', command].execute()
proc.waitFor()
println proc.text

如果要运行多个命令,可以将其添加到命令中。

def command = '''
    ls -ltr
    cat secret
'''
def proc = ['bash', '-c', command].execute()
proc.waitFor()
println proc.text

答案 3 :(得分:0)

如果你想要它同步我推荐

 proc.consumeProcessOutputStream(new LineOrientedOutputStream() {
        @Override
        protected void processLine(String line) throws IOException {
           println line
        }
    }
    );