标记‘ps’命令可以过滤参数吗?

标记‘ps’命令可以过滤参数吗?

我知道可以过滤命令的参数“-C”。

但在我的场景中,我可能有一些具有相同进程名称和不同参数的进程。

如何过滤这些参数?

(我知道我可以稍后通过管道传输到 grep,但这并不是 100% 准确。例如:当一个参数可能包含另一个参数时,比如如果我想通过这些列表中的参数“bar”进行过滤:

+---------+---------+-----------+
| Process | Command | Arguments |
+---------+---------+-----------+
| 23      | foo     | bar       |
| 48      | foo     | barbaz    |
+---------+---------+-----------+

PS:我猜大多数答案都会建议我使用“pgrep”而不是“ps”,但如果可能的话,我想避免这种情况。

答案1

我认为您无法ps单独使用来实现这一点。您说得对,使用过滤grep并不理想,但如果您愿意尝试,pgrep那么您可以使用以下方法非常接近您的要求:

ps -p $(pgrep -f bar -d',')

-f选项pgrep搜索完整的命令行(而不仅仅是进程名称),而该-d选项指定用于将 pid 串在一起的分隔符。

传递 pid 列表从而ps将输出限制为完整命令(包括参数)中包含关键字的输出。

在您想要匹配“foo bar”而不是“foo barbaz”的示例中,您可以使用以下命令搜索完全匹配:

ps -p $(pgrep -f "foo bar$" -d',')   # Note the eol anchor '$'

答案2

我不相信有这样的选项存在 - 至少在我的版本中不存在ps。我怀疑许多ps实现都有这样的选项 - 命令名称定义起来非常简单,但对于命令参数来说绝对不是这样。

无论如何,Unix 的理念是将许多简单的工具(例如psgrep)串联起来,以执行更复杂的任务。有人可能会说,即使如此,这也是ps -C在推动它 - 事实上,我相信 MacOS Xps没有这样的选择。

你到底想做什么?是什么语境回答你的问题?因为,根据我的经验,在 99% 的情况下,人们通过解析输出来自动化操作,而ps他们所做的一切都是错误的……

相关内容