標記為可以過濾參數的“ps”命令?

標記為可以過濾參數的“ps”命令?

我知道參數“-C”可以過濾命令。

但在我的場景中,我可能有一些具有相同進程名稱和不同參數的進程。

如何過濾這些參數?

(我知道我可以稍後通過管道傳輸到 grep,但這並不是 100% 準確。即:當一個 arg 可能包含另一個 arg 時,例如如果我想按這些列表中的 arg“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他們所做的一切都是錯的…

相關內容