在java中使用linux grep命令时出错

时间:2017-11-09 11:03:25

标签: java linux bash shell

我正在尝试使用流程构建器在java中获取grep linux shell命令的输出。但我在这种情况下陷入了困境。请帮我。 感谢您的建议!

    String[] args = new String[7];
    args[0] = "/bin/bash";
    args[1] = "-c";
    args[2] = "grep";
    args[3] = "-n";
    args[4] = "-e";
    args[5] = "KERNELVERSION";
    args[6] = kernelFilePath.trim();

ProcessBuilder pb;
    Process process = null;
    try {
        pb = new ProcessBuilder(args);
        pb = pb.directory(new File(directory));
        pb.inheritIO();
        pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
        pb.redirectError(ProcessBuilder.Redirect.INHERIT);
        process = pb.start();
        process.waitFor();
    } catch (IOException | InterruptedException e) {
        System.out.println("executeCmdWithOutput() exception : " + e.toString());
    } finally {
        if (process != null) {
            process.destroy();
        }
    }

==>错误:

  

用法:grep [OPTION] ... PATTERN [FILE] ...

     

尝试'grep --help'获取更多信息。

我在bash中尝试了这个命令并且运行正常:

grep -n -e KERNELVERSION ..../Makefile

2 个答案:

答案 0 :(得分:2)

您是否尝试将args [2]更改为完整命令?

此外,您可以使用pgrep,它不需要您使用管道。

答案 1 :(得分:0)

您无需显式运行/bin/bash即可执行grep进程。只需直接调用它,ProcessBuilder就会运行它:

String[] args = {"grep", "-n", "KERNELVERSION", kernelFilePath.trim()};

此外,您不需要使用-e选项,除非您要搜索多个模式。

如果您真的想在grep中运行/bin/bash

String[] args = {"/bin/bash", "-c", "grep -n KERNELVERSION " + kernelFilePath.trim()};

将单个参数传递给bash,其中包含要执行的完整命令和参数。