2017-06-01 70 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命令是你想要的執行在終端 –