
我知道參數“-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 的哲學是連結許多簡單的工具(例如ps
和grep
)來執行更複雜的任務。有人可能會說,甚至ps -C
是在推動它——事實上,我相信 MacOS Xps
沒有這樣的選擇。
你到底想做什麼?是什麼情境對你的問題?因為,根據我的經驗,在 99% 的情況下,人們透過解析輸出來實現自動化,但ps
他們所做的一切都是錯的…