1

我有test.sh哪个程序调用了一些程序,并且该程序输出了一些行。

我的需要是只捕获最后一行输出

所以如果我做简单

bash test.sh | tail -n 1  ========> Command 1

然后我得到错误"Do you want output to go to | or to tail"

所以要解决上述问题,我会

(bash test.sh) | tail -n 1   =======> Command 2 

然后我得到简单的 1 行日志。到目前为止,一切都很好。

现在我需要通过java程序调用上面的命令,所以我将'('作为第一个参数传递给ProcessBuilder但它抱怨它不能理解'('作为第一个参数。

我怎样才能通过Command 2ProcessBuilder获得最后一行日志。

我对bash和linux不是很熟悉,所以请原谅我的无知。我什至不知道为什么我会出错command 1

4

4 回答 4

0

好吧,既然您现在使用的是 Java,那么您可以使用它的“一次编写,到处运行”的特性。编写一个程序,打开一个文件,读取它的行,然后获取最后一个。它适用于任何平台。

一个很好的类是BuffedReader

于 2012-09-11T20:47:54.520 回答
0

Java ProcessBuilder(以及相应的Runtime.exec方法)不支持管道(|)、重定向(>)和运行多个命令(&)。相反,您应该创建一个单独的脚本来调用您的 bash 脚本并将其通过管道传递给 tail:

#!/bin/sh
#tailLog.sh
bash test.sh | tail -n 1

然后在Java中:

processBuilder.command("tailLog.sh");

请记住,|以及其他 shell 标记是特定于shell的,因此 Java 不会识别它们。

于 2012-09-11T21:09:24.207 回答
0

要获取文件中的最后一行,请使用 -

$tail -1 filename.dat

快速演示

$ cat filename.dat
Line 1
Line 2
Line 3
Line 4
End Line
$ tail -1 filename.dat
End Line
于 2012-09-11T21:05:17.163 回答
0

您可以在此处重新排序以使其更容易。

  • 无需使用 tail 命令,因为您可以在读取 ProcessBuilder 输出时捕获最后一个命令。
  • 要确保您的脚本在您的 Java 应用程序调用它时运行,请确保它#!/bin/bash出现在您的脚本中的第一行。还要确保它是可执行的。

这是一个改编自现有应用程序的代码,它将捕获最后一行。

ProcessBuilder builder = new ProcessBuilder("test.sh");
Process process = builder.start();
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
String lastLine = null;
while ((line = br.readLine()) != null) {
if (line != null) {
   lastLine = line;
}
}

System.out.println(lastLine);
于 2012-09-11T21:11:48.487 回答