如何在控制台上显示命令的输出?
<?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
它。因为它丢失了格式,我的正则表达式是没用的。
答案 0 :(得分:3)
您需要将exec与通过引用传递给它的变量一起使用来捕获输出行。
$lastLine = exec('df -h',$output);
exec只返回它所鼓励的最后一行作为它的返回值,你会发现在你的$ output参数中执行的命令exec的完整输出(你提供的变量by reference exec()转换为一个数组并填满,另见PHP: References Explained)
e.g。
<?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或反引号对你不起作用,抱歉。
现在为你的解析模式:
<?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将它返回到数组中时,所有这些都被删除了,但在我看来,模式应该可以正常工作。
答案 1 :(得分:1)
使用反引号运算符(`)应该保留输出格式。
$lastline = `ls`;
答案 2 :(得分:1)
如果您不想输出任何内容,也可以使用exec()
。但是$last_line
只包含命令打印的实际最后一行。如果要处理整个输出,可以将其重定向到第二个参数为exec()
的数组。
答案 3 :(得分:0)
如果没有看到你用于比赛的正则表达式,很难说。我的猜测是你试图匹配不在此转换字符串中的非打印字符。尝试匹配 \ s ,它会查找几种类型的空格字符。