我知道可以过滤命令的参数“-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 的理念是将许多简单的工具(例如ps
和grep
)串联起来,以执行更复杂的任务。有人可能会说,即使如此,这也是ps -C
在推动它 - 事实上,我相信 MacOS Xps
没有这样的选择。
你到底想做什么?是什么语境回答你的问题?因为,根据我的经验,在 99% 的情况下,人们通过解析输出来自动化操作,而ps
他们所做的一切都是错误的……