5

我有一个系统脚本,它运行并将“ps aux | grep 实用程序”的结果通过管道传输到一个文本文件并 chowns 文本文件,以便 Web 服务可以读取该文件并在我的 Web 应用程序中显示结果。

以下是原始结果的示例:

user     12052  0.2  0.1 137184 13056 ?        Ss   10:00   0:00 php /home/user/public_html/utilities/runProcFile.php cust1 cron
user     12054  0.2  0.1 137184 13064 ?        Ss   10:00   0:00 php /home/user/public_html/utilities/runProcFile.php cust3 cron
user     12055  0.6  0.1 137844 14220 ?        Ss   10:00   0:00 php /home/user/public_html/utilities/runProcFile.php cust4 cron
user     12057  0.2  0.1 137184 13052 ?        Ss   10:00   0:00 php /home/user/public_html/utilities/runProcFile.php cust89 cron
user     12058  0.2  0.1 137184 13052 ?        Ss   10:00   0:00 php /home/user/public_html/utilities/runProcFile.php cust435 cron
user     12059  0.3  0.1 135112 13000 ?        Ss   10:00   0:00 php /home/user/public_html/utilities/runProcFile.php cust16 cron
root     12068  0.0  0.0 106088  1164 pts/1    S+   10:00   0:00 sh -c ps aux | grep utilities > /home/user/public_html/logs/dashboard/currentlyPosting.txt
root     12070  0.0  0.0 103240   828 pts/1    R+   10:00   0:00 grep utilities

当我的 php 脚本解析这个文本文件时,我只需要提取以下内容(只是一个示例):

cust1
cust3
cust4
cust89
cust435
cust16

我尝试了许多不同的笨拙方法,但似乎没有任何效果。我在下面列出的方式有效,但有时也会抓取垃圾,因为一行中的“空格”数量会随着变化而爆炸。

public function showProcesses() {
    $lines = file(DIR_LOGGER_ROOT . "dashboard/currentlyPosting.txt");
    $results = array();
    $i = 0;
    foreach($lines as $line) {
        if (preg_match("/php/i", $line)) {
            $userProcess = explode(" ", $line);
            if($userProcess[29] != "0:00" && strlen($userProcess[29]) < 20) {
                $results[$i] = $userProcess[29];
                $i++;
            }
        }
    }
    return $results;
}

你们中的一些人可以为此发布优雅的解决方案吗?我正在努力学习更好的做事方式,并希望得到指导。

4

3 回答 3

1

您可以使用preg_split代替explode并拆分[ ]+(一个或多个空格)。但我认为在这种情况下,您可以使用preg_match_all捕获

preg_match_all('/[ ]php[ ]+\S+[ ]+(\S+)/', $input, $matches);
$result = $matches[1];

该模式匹配一​​个空格php、多个空格、一个非空格字符串(路径)、更多空格,然后捕获下一个非空格字符串。第一个空格主要是为了确保您不匹配php作为用户名的一部分,而实际上只是作为命令。

捕获的替代方法是 PCRE 的“保留”功能。如果您\K在模式中使用,则在匹配中丢弃之前的所有内容:

preg_match_all('/[ ]php[ ]+\S+[ ]+\K\S+/', $input, $matches);
$result = $matches[0];
于 2013-01-02T16:21:02.197 回答
0

我会用preg_match(). 我为我的许多系统管理脚本做了类似的事情。这是一个例子:

$test = "user     12052  0.2  0.1 137184 13056 ?        Ss   10:00   0:00 php /home/user/public_html/utilities/runProcFile.php cust1 cron
user     12054  0.2  0.1 137184 13064 ?        Ss   10:00   0:00 php /home/user/public_html/utilities/runProcFile.php cust3 cron
user     12055  0.6  0.1 137844 14220 ?        Ss   10:00   0:00 php /home/user/public_html/utilities/runProcFile.php cust4 cron
user     12057  0.2  0.1 137184 13052 ?        Ss   10:00   0:00 php /home/user/public_html/utilities/runProcFile.php cust89 cron
user     12058  0.2  0.1 137184 13052 ?        Ss   10:00   0:00 php /home/user/public_html/utilities/runProcFile.php cust435 cron
user     12059  0.3  0.1 135112 13000 ?        Ss   10:00   0:00 php /home/user/public_html/utilities/runProcFile.php cust16 cron
root     12068  0.0  0.0 106088  1164 pts/1    S+   10:00   0:00 sh -c ps aux | grep utilities > /home/user/public_html/logs/dashboard/currentlyPosting.txt
root     12070  0.0  0.0 103240   828 pts/1    R+   10:00   0:00 grep utilities";

$lines = explode("\n", $test);

foreach($lines as $line){
        if(preg_match("/.php[\s+](cust[\d]+)[\s+]cron/i", $line, $matches)){
                print_r($matches);
        }

}

以上打印:

Array
(
    [0] => .php cust1 cron
    [1] => cust1
)
Array
(
    [0] => .php cust3 cron
    [1] => cust3
)
Array
(
    [0] => .php cust4 cron
    [1] => cust4
)
Array
(
    [0] => .php cust89 cron
    [1] => cust89
)
Array
(
    [0] => .php cust435 cron
    [1] => cust435
)
Array
(
    [0] => .php cust16 cron
    [1] => cust16
)

您可以设置$test为等于 exec 的输出。您要查找的值将ifforeach. $matches[1]将具有 custx 值。

于 2013-01-02T16:20:32.413 回答
0

如果值之间的行中的空格数是可变的,则可以使用preg_split

你只需要改变:

$userProcess = explode(" ", $line);

至:

$userProcess = preg_split("#\s+#", $line);

\s+将匹配一个或多个空格、制表符或其他空白字符。

然后你可以得到倒数第二个项目:

$txt = $userProcess[count($userProcess) - 2];
于 2013-01-02T16:21:56.317 回答