【问题标题】:Parsing grep output解析 grep 输出
【发布时间】:2011-09-21 07:47:52
【问题描述】:

我正在尝试做一个服务器管理器,这是我目前所拥有的:

<?php
$COMMAND = shell_exec('ps ax --format command | grep skulltag');
$arr = explode("./",$COMMAND);
$text = shell_exec('pgrep -u doom');
$arrtext = preg_split('/\s+/', $text);
 for( $i = 1; $i < count($arr); $i++ ) {
    echo $i,". PROCESS ID ",$arrtext[$i]," Command issued: ",$arr[$i];
    echo '<br>';
 }
?>

如您所见,我将 $COMMAND 字符串与 ./(文件执行)分开。但是,出于某种原因,列表末尾有这样的内容:

sh -c ps ax --format command | grep skulltag grep skulltag 

这是完整的输出供参考:

  1. PROCESS ID 4793 命令发出:skulltag-server
  2. PROCESS ID 4956 命令发出:skulltag-server -port 13000
  3. PROCESS ID 4958 命令发出:skulltag-server -port 13001 sh -c ps ax --format 命令 | grep 骷髅标签 grep 骷髅标签

摆脱这条线的最简单和最有效的方法是什么,我该怎么做?谢谢。

【问题讨论】:

  • 如果我明白你在问什么,典型的解决方案是使用与自身不匹配的模式,例如grep [s]kulltag.
  • “出于某种原因”——那是因为您正在运行的命令正在运行,所以它显示在正在运行的进程列表中。
  • 如果你有pgrep,为什么要重新实现它?

标签: php linux shell grep


【解决方案1】:

改变这个:

ps ax --format command | grep skulltag

到这里:

ps ax --format command | grep [s]kulltag

这样,grep 命令本身就包含字符串 '[s]kultag',而 grep 正则表达式 '[s]kultag' 则不匹配。

另外,有两个建议: 1. 不能保证您最初的 ps | grep 和你以后的 pgrep 将排队。相反,使用单个 pgrep:

pgrep -afl skulltag

还有 2. 你的 for 循环从 1 开始,这将跳过 arr[0] 中的过程。

你的 php 可以这样重写:

$processes = explode("\n", shell_exec('pgrep -afl skulltag'));
foreach($processes as $i => $process) {
    ($pid, $command) = explode(' ',$process,2);
    echo $i+1,". PROCESS ID ",$pid," Command issued: ",$command;
    echo '<br>';
}

【讨论】:

    【解决方案2】:

    我快速而肮脏的解决方案是将| grep -v grep 附加到命令中。

    【讨论】:

    • 修复正则表达式更优雅。
    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    相关资源
    最近更新 更多