您需要将exec与通过引用传递给它的变量一起使用以捕获您的输出线。
$lastLine = exec('df -h',$output);
exec 只返回它遇到的最后一行作为它的返回值,你会发现在你的 $output 参数中执行的命令 exec 的完整输出(你通过引用提供的变量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 或反引号对你不起作用,对不起。
现在为您的解析模式:
<?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 将其返回到数组中时,您不需要剥离标题以及所有这些,但我认为该模式应该可以正常工作。