2013-04-23 117 views
0

我想檢索多行文本文件和處理行。返回特定的命令行unix php

例子:

$user = system('getent passwd') ."\n"; 

結果exmple:

tcpdump:x:72:72::/:/sbin/nologin 
guest:x:500:500:Guest User:/home/guest:/bin/bash 
dovecot:x:97:97:Dovecot IMAP server:/usr/libexec/dovecot:/sbin/nologin 
dovenull:x:495:488:Dovecots unauthorized user:/usr/libexec/dovecot:/sbin/nologin 
sa-milt:x:494:487:SpamAssassin Milter:/var/lib/spamass-milter:/bin/bash 
demo1:*:2417:100:albert DemoUn:/home/gir_net/demo1:/bin/bash 
demo2:*:2418:100:alfred DemoDeux:/home/gir_net/demo2:/bin/bash 
demo3:*:2419:100:alphonse DemoTrois:/home/gir_net/demo3:/bin/bash 
demo4:*:2420:100:alcide DemoQuatre:/home/gir_net/demo4:/bin/bash 

我要檢索的全線誰在命令的結果 「/家/」。 我嘗試了很多解決方案,但它不起作用。

我檢索後,我想提取包含「/ home /」的行的索姆姆信息。

回答

1

下面是使用正則表達式可能的解決方案:

$user = shell_exec('getent passwd'); 
preg_match_all('/\/home\/[^:]+/', $user, $matches); 

foreach ($matches[0] as $dir) { 
    print $dir; 
} 

/* will print: 
/home/guest 
/home/gir_net/demo1 
/home/gir_net/demo2 
/home/gir_net/demo3 
/home/gir_net/demo4 
*/ 

更新:

如果你想顯示完整的線,它會更容易,而不是使用正則表達式的字符串函數。

$user = shell_exec('getent passwd'); 
$user = explode("\n", trim($user)); 
foreach ($user as $line) { 
    if (strpos($line, '/home/') !== FALSE) { 
     echo $line."\n"; 
    } 
} 
+0

對我來說,我只看到:/ home/gir_net/demo4,只有最後一個。甲的var_dump($結果)=>數組(1){ [0] => 陣列(1){ [0] => 串(32) 「/家/ giron_net/demo6」 } } – mpgn 2013-04-23 12:53:18

+0

我忘了'system()'只返回最後一行。嘗試使用'$ user = shell_exec('getent passwd');'獲取完整的輸出字符串。 – flowfree 2013-04-23 12:55:35

+0

哇,它的工作,但匹配不返回包含「/ home /」,但她開始在/ home /的完整行。我沒有:demo1:*:2417:100:albert DemoUn: – mpgn 2013-04-23 13:03:03

0

$user轉成an arraygrep吧。關於提取,如果你想得到一些幫助,你應該提供細節。無論如何回來嘗試你可以獲得爆炸和grep。

+0

我已經嘗試,但結果是隻有最後一行(demo4),demo1,2,3或不識別該陣列... – mpgn 2013-04-23 12:58:39

+0

看到bsdnoobz評論;總的來說,我避免使用系統,所以我不習慣它的細節;一旦你有所有的線,爆炸和grep應該工作 – ShinTakezou 2013-04-23 13:02:48

+1

是的,我們需要使用「shell_exec」而不是系統。 – mpgn 2013-04-23 13:06:03