2017-06-01 146 views
0

我已经测试了以下方法从我的程序执行Linux命令执行

方法1:所有分配到一个字符串系统命令无法从程序

String temp1 = "'/"+t2+"/,/"+t1+"/p'"; 
String command2 = "sed -n "+temp1+" app.log"; 
Process p1 = Runtime.getRuntime().exec(command2); 



方法2:使用阵列

String [] command2 = new String []{"sed","-n","'/",t2,"/,/",t1,"/p'", "app.log"; 
System.out.println("The command2 is : "+Arrays.toString(command2); 
Process p2 = new ProcessBuilder(command2).start(); 



对于方法2,这是我的参考文献link,但两种方法根本不起作用。这是我希望在终端
sed -n '/14:32:54/,/14:33:44/p' app.log

这是我的代码部分用于调用系统命令运行的命令,没有任何显示在line2可变

String [] command2 = new String []{"sed","-n","'/",t2,"/,/",t1,"/p'","stlog.txt"}; 
Process p2 = new ProcessBuilder(command2).start(); 
BufferedReader br2 = new BufferedReader(new InputStreamReader(p2.getInputStream())); 
String line2; 
while((line2 = br2.readLine()) != null) 
    { 
     System.out.println(line2); 
    } 
+0

不会在上面执行'sed的-n“/ T2 /,/ T1/P” stlog.txt',即在您正则表达式,甚至更糟糕了一大堆不必要的空间,通过七参数到'sed'? '“sed”,“ - n”,“'/”+ t2 +“/,/”+ t1 +“/ p'”,“stlog.txt”'可能是一个快速解决方案。 –

+0

能够提供关于快速解决方案的更多解释? – yumi

+0

这通常是一个PATH问题......您是否尝试传递'sed'(通常为'/ usr/bin/sed')的完整路径? –

回答

1

在我的情况下工作:

ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "-c", "pwd") 
        .directory(new File("some.directory.path")); 
Process process = processBuilder.start(); 

或者你可以一边使用的ProcessBuilder并调用

String command = "ping www.google.com"; 
String[] commandArray = {"/bin/bash", "-c", "pwd"}; 
Runtime.getRuntime().exec(commandArray); 

“/斌/庆典” 0意味着你将要在巴赫

到exec命令 “-c” - 定义,明年参数是命令

命令 - 任何类似“ping www.google.com”或“./script.sh”的命令都可以通过终端执行

您应该将命令改为“ping www.google.com”,但是因为您没有指定目录 - 脚本将从项目目录执行(您可以通过执行“pwd”命令来检查它是否打印当前目录)。这就是为什么ProcessBuilder更可取,因为您可以在那里指出执行目录(用您的dir替换“some.directory.path”)。

.directory(new File("path/to/some/dir")); 
+0

,所以你的意思是我需要用我的“sed”替换“pwd”? – yumi

+0

我已经用“ping www.yahoo.com”或“grep apple app.log”这样的简短命令进行了测试,结果很有用。当命令变得更长时,它不能通过使用程序 – yumi

+0

来呼叫我的意思是你需要传递所有3个参数(“/ bin/bash”,“-c”,command),其中command = real命令是你想要的执行在终端 –