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 2するにはどうすればよいですか。ProcessBuilder

私は bash と Linux にあまり詳しくないので、私の無知を許してください。のエラーが発生する理由さえわかりませんcommand 1

4

4 に答える 4

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

Java ProcessBuilder(およびその結果としてのメソッド) は、パイピング ( )、リダイレクト ( )、および複数のコマンドの実行 ( )Runtime.execをサポートしていません。代わりに、bash スクリプトを呼び出して末尾にパイプする別のスクリプトを作成する必要があります。|>&

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

次にJavaで:

processBuilder.command("tailLog.sh");

およびその他のシェル トークンは shell|固有であるため、Java はそれらを認識しないことに注意してください。

于 2012-09-11T21:09:24.207 に答える
0

これを簡単にするために、ここで並べ替えを行うことができます。

  • ProcessBuilder の出力を読み取るときに最後をキャプチャできるため、tail コマンドを使用する必要はありません。
  • 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 に答える
0

さて、あなたは現在 Java を使用しているので、「一度書けばどこでも実行できる」という側面を利用できます。ファイルを開き、その行を読み取り、最後の行を取得するプログラムを作成します。どのプラットフォームでも機能します。

それに適したクラスはBuffedReaderです。

于 2012-09-11T20:47:54.520 に答える