2010-01-30 50 views
3

我試圖解析當前通過SSH連接到服務器的用戶的列表Linux命令的輸出,但結果是非常不規則的,所以我不得不簡單地做:解析「誰」在PHP

$users = shell_exec('who'); 
echo "<pre>$users</pre>"; 

在我讓PHP弄亂它之前,有沒有更好的方法在命令行中解析who的輸出?我希望它包含用戶名(下面的第一列),它們連接的終端(第二列),它們連接的日期和時間(第三)以及它們連接的位置(括號內)。我猜我應該用preg_split分割數據,但它似乎真的有時與用戶名長度,終端名稱等不規則..

(的who一些輸出爲例):

alex  tty7   2010-01-23 17:04 (:0) 
alex  pts/0  2010-01-30 17:43 (192.168.1.102) 
root  pts/1  2010-01-30 17:45 (192.168.1.102) 

回答

4

explode()荷蘭國際集團上換行符(\n)爲您提供每行一個項目,當你升的陣列在數組中輸入,並使用preg_split("/\s+/", $sValue, 3),它應該爲每個列提供一個新的數組作爲一個項目。然後你需要拆分日期和地址。

完整的代碼會是這樣的:

<?php 
$sTempUsers = shell_exec('who'); 
$aTempUsers = explode("\n", $sTempUsers); 

$aUsers = array(); 
foreach($aTempUsers AS $sUser) 
{ 
    $aTempUser = preg_split("/\s+/", $sUser, 3); // username | terminal | date addr 
    preg_match("/^(.+)\s\((.+)\)$/", $aTempUser[2], $aDateAndAddr); // full match | date | addr 

    $aUsers[] = array(
     $aTempUser[0], 
     $aTempUser[1], 
     $aDateAndAddr[1], 
     $aDateAndAddr[2] 
    ); // username | terminal | date | addr 
} 
?> 

您可以找到結果$aUsers

0

preg_split只需要匹配的數據之間的空間,而不是數據本身:

$who = shell_exec('who'); 
$users = array(); 
foreach(split("\n", $who) as $user) { 
    $users[] = preg_split("/\s{2,}/", $user); //Match 2 or more whitespace chars 
} 
0
$who = shell_exec('who'); 
$s = split("\n",$who); 
$func = function($value) { return preg_split("/\s{2,}/",$value); }; 
print_r(array_map($func, $s));