1

コンソールに表示されるようなコマンドの出力を取得するにはどうすればよいですか?

<?php
ob_start();
system('faxstat -s' , $retval);
$last_line = ob_get_contents();
ob_end_clean();
preg_match('/^32.+\s{9}(.*)/m', $last_line, $job_id);
?>

コンソールでは、出力は次のようになります。

JID  Pri S  Owner Number       Pages Dials     TTS Status
36   127 R www-da 0xxxxxxxx     0:1   0:12         
32   127 R www-da 0xxxxxxxx     0:1   0:12         
35   127 R www-da 0xxxxxxxx     0:1   0:12         

しかし、PHP では、エコー$last_lineは次のようになります。

JID Pri S 所有者番号 ページ ダイヤル TTS ステータス 36 127 R www-da 0xxxxxxxx 0:1 0:12 32 127 R www-da 0xxxxxxxx
0:1 0:12 35 127 R www-da 0xxxxxxxx 0:1 0:12

注:出力を印刷したくないので、<pre>タグは必要ありません。したいpreg_match。フォーマットが失われるため、私の正規表現は役に立ちません。

4

4 に答える 4

3

出力行をキャプチャするには、参照によって渡される変数とともにexecを使用する必要があります。

$lastLine = exec('df -h',$output);

execは、戻り値として、最後の行のみを返します。実行されたコマンドexecの完全な出力は、$ outputパラメーター(exec()が配列に変換して埋める参照によって提供された変数)で実行されます。また、PHP:参照の説明

例えば

<?php
$lastLine = exec('df -h',$output);

print "\n$lastLine\n";
print_r($output);

印刷します

none                  990M     0  990M   0% /var/lock

Array
(
    [0] => Filesystem            Size  Used Avail Use% Mounted on
    [1] => /dev/sda1             145G  140G  5.8G  97% /
    [2] => none                  981M  668K  980M   1% /dev
    [3] => none                  990M  3.4M  986M   1% /dev/shm
    [4] => none                  990M  240K  989M   1% /var/run
    [5] => none                  990M     0  990M   0% /var/lock
)

ご覧のとおり、$ lastLineは、実際にはコマンドが出力した最後の行です。

申し訳ありませんが、shell_execまたはbackticksが機能しない理由がわかりません。

次に、構文解析パターンについて説明します。

<?php

// was stil using your posted 'wrong output'
$output = "JID Pri S Owner Number Pages Dials TTS Status 36 127 R www-da 0xxxxxxxx 0:1 0:12 32 127 R www-da 0xxxxxxxx 
0:1 0:12 35 127 R www-da 0xxxxxxxx 0:1 0:12";

// we just strip the header out
$header = "JID Pri S Owner Number Pages Dials TTS Status ";

$headerless = str_replace($header,'',$output);

$pattern = '/([0-9]+)\s+([0-9]+)\s+([A-Z]+)\s+([^\s]+)\s+([^\s]+)\s+([0-9:]+)\s+([0-9:]+)/m'; // m to let it traverse multi-line

/*
  we match on 0-9 whitespace 0-9 WS A-Z 'Anything not WS' WS ANWS WS 0-9:0-9 WS 0-9:0-9
*/
preg_match_all($pattern,$headerless,$matches);
print_r($matches);

これにより、すべての個別の要素が得られます。明らかに、execを使用して配列で返す場合は、ヘッダーなどをすべて削除する必要はありませんが、私の意見では、パターンは正常に機能するはずです。

于 2012-06-20T21:27:50.190 に答える
1

バックティック演算子( `)を使用すると、出力フォーマットが保持されます。

$lastline = `ls`;
于 2012-06-20T20:29:41.770 に答える
1

何も出力したくない場合は、 も使用できますexec()。ただし$last_line、コマンドによって出力された実際の最後の行のみが含まれます。出力全体を処理したい場合は、2 番目のパラメーターを使用して配列にリダイレクトできますexec()

于 2012-06-20T20:36:02.053 に答える
0

マッチに使用している正規表現を見ずに言うのは難しいです。私の推測では、この変換された文字列に含まれていない非印刷文字に一致させようとしていると思います。いくつかのタイプの空白文字を探す\sでマッチングを試みます。

于 2012-06-20T20:18:15.567 に答える