在命令行和java代码中运行grep命令会得到不同的结果

在命令行和java代码中运行grep命令会得到不同的结果,java,command-line,Java,Command Line,当我在终端中运行下面的grep命令时,我得到了行号列表。但是当我尝试通过java代码做同样的事情时,我没有得到任何结果。我不确定这里出了什么问题 提前感谢 grep -in "callback recieved" /home/local/ws/ui_auto/UIAutomator/result/test/logs | cut -f1 -d: public List<Integer> getLineNumbers(String pattern, String file, Stri

当我在终端中运行下面的grep命令时,我得到了行号列表。但是当我尝试通过java代码做同样的事情时,我没有得到任何结果。我不确定这里出了什么问题

提前感谢

grep -in "callback recieved" /home/local/ws/ui_auto/UIAutomator/result/test/logs | cut -f1 -d:


public List<Integer> getLineNumbers(String pattern, String file, String pat) {
    String[] cmd = { "/bin/sh", "-c", "grep -in \""+ pattern + "\" " + file + " | cut -f1 -d:"}; // > " + file + "_" + pat };
    System.out.println(cmd[2]);
    Process proc;
    List<Integer> rline = new ArrayList<Integer>();
    try {
        proc = Runtime.getRuntime().exec(cmd);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
            rline.add(Integer.parseInt(line));
        }
    } catch (IOException e) {
        System.out.println(e);
    }
    return rline;
}
grep-in“received callback”/home/local/ws/ui_auto/UIAutomator/result/test/logs | cut-f1-d:
公共列表GetLineNumber(字符串模式、字符串文件、字符串格式){
字符串[]cmd={/bin/sh',“-c”,“grep-in\”“+pattern+”\”“+file+”;cut-f1-d:“};//>”+file+“+pat};
System.out.println(cmd[2]);
过程过程;
List rline=new ArrayList();
试一试{
proc=Runtime.getRuntime().exec(cmd);
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(proc.getInputStream());
弦线;
而((line=bufferedReader.readLine())!=null){
系统输出打印项次(行);
rline.add(Integer.parseInt(line));
}
}捕获(IOE异常){
系统输出打印ln(e);
}
回线;
}

根据我们在评论中的讨论。如果1秒的快步对您有效,请尝试:

proc.waitFor(); 
Process.waitFor()阻塞当前线程,直到进程结束 终止,此时执行控制返回到线程 这催生了这一过程


把它放在:proc=Runtime.getRuntime().exec(cmd);

它会引发任何错误或异常吗?可能是您的命令字符串有问题。它不应该是“grep-in”而不是“grep-in”吗\“。并尝试使用ProcessBuilder。由于您正在传递许多参数,因此这可能是一个更好的选择。为了查看出错的原因,请从proc获取errorStream并检查是否发生了错误?尝试使用ProcessBuilder,但无效。我怀疑这个命令需要时间来完成执行,所以我在“proc=Runtime.getRuntime().exec(cmd);”之前添加了1秒的睡眠时间,它成功了。我无法理解发生了什么,以及如何纠正。我添加了一个答案作为可能的解决方案。请告诉我,它是否适用于您。