0

テキスト ファイルの複数行を取得し、行を処理したいと考えています。

例 :

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

結果の例:

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/」が含まれる行全体を取得したい。私は多くの解決策を試していますが、うまくいきません。

検索した後、「/home/」を含む行のいくつかの情報を抽出したいと思います。

4

2 に答える 2

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";
    }
}
于 2013-04-23T12:44:47.517 に答える
0

配列$user変換してgrepします。抽出について、助けが必要な場合は詳細を提供する必要があります。とにかく、explode と grep で得られるものを試してから戻ってきてください。

于 2013-04-23T12:44:44.563 に答える