我有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 2
传递给ProcessBuilder
以获取最后一行日志。
我对bash和linux不是很熟悉所以请原谅我的无知。我甚至不知道为什么我收到command 1
的错误。
答案 0 :(得分:0)
好吧,既然你现在正在使用Java,你可以使用它的“一次编写一次运行”方面。编写一个打开文件的程序,读取它的行,然后获取最后一行。它适用于任何平台。
一个很好的课程是BuffedReader。
答案 1 :(得分:0)
要获取文件中的最后一行 -
$tail -1 filename.dat
快速演示
$ cat filename.dat
Line 1
Line 2
Line 3
Line 4
End Line
$ tail -1 filename.dat
End Line
答案 2 :(得分:0)
Java的ProcessBuilder
(以及Runtime.exec
方法)不支持管道(|
),重定向(>
)和运行多个命令({{ 1}})。相反,您应该创建一个单独的脚本来调用您的bash脚本并将其传递给尾部:
&
然后在Java中:
#!/bin/sh
#tailLog.sh
bash test.sh | tail -n 1
请记住,processBuilder.command("tailLog.sh");
和其他shell令牌特定于 shell ,因此Java无法识别它们。
答案 3 :(得分:0)
你可以在这里做一些重新排序,以使这更容易。
#!/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);