2013-04-23 91 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