Reputation: 19567
Using Groovy and it's java.lang.Process
support, how do I pipe multiple shell commands together?
Consider this bash command (and assume your username is foo
):
ps aux | grep ' foo' | awk '{print $1}'
This will print out usernames - one line for some processes related to your user account.
Using Groovy, the ProcessGroovyMethods documentation and code says I should be able to do this to achieve the same result:
def p = "ps aux".execute() | "grep ' foo'".execute() | "awk '{print $1}'".execute()
p.waitFor()
println p.text
However, I can't get any text output for anything other than this:
def p = "ps aux".execute()
p.waitFor()
println p.text
As soon as I start piping, the println does not print out any anything.
Thoughts?
Upvotes: 23
Views: 36541
Reputation: 5451
This has worked for me
def command = '''
ps aux | grep bash | awk '{print $1}'
'''
def proc = ['bash', '-c', command].execute()
proc.waitFor()
println proc.text
If you want to run multiple commands, you can add it in the command.
def command = '''
ls -ltr
cat secret
'''
def proc = ['bash', '-c', command].execute()
proc.waitFor()
println proc.text
Upvotes: 8
Reputation: 980
If you want it async I recommend
proc.consumeProcessOutputStream(new LineOrientedOutputStream() {
@Override
protected void processLine(String line) throws IOException {
println line
}
}
);
Upvotes: 0
Reputation: 11032
This works for me :
def p = 'ps aux'.execute() | 'grep foo'.execute() | ['awk', '{ print $1 }'].execute()
p.waitFor()
println p.text
for an unknown reason, the parameters of awk can't be send with only one string (i don't know why! maybe bash is quoting something differently). If you dump with your command the error stream, you'll see error relative to the compilation of the awk script.
Edit : In fact,
"-string-".execute()
delegate to Runtime.getRuntime().exec(-string-)
"grep ' foo'".execute()
execute the command grep, with '
as the first parameters, and foo'
as the second one : it's not valid. the same for awkUpvotes: 35
Reputation: 171194
You can do this to just let the shell sort it out:
// 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
Upvotes: 17