The Issue of the Day Before

過濾 ps 輸出不要包含 grep 自己

linux -

在使用 ps 指令查詢目前執行的 process 時,為方便通常會搭配 grep 指令來過濾結果。 但因為 grep 本身也是一個 process ,所以常常過濾的結果還會包含 grep 指令本身。 這可能不是我們想要的。那應該如何下指令?

例如:

e.q.
> ps -ef | grep init

root         1     0  0  2016 ?        00:00:11 /sbin/init              // (1)
root     17064 24257  0 15:51 pts/2    00:00:00 grep --color=auto init  // (2)
  1. 真正要查的結果

  2. grep 指令多出來的結果

一般方法

直覺上,既然多出來就在過濾掉就好。 grep 指令的在 PATTERN 上是沒有否定算子的,但有一個反向參數。 你可以使用 grep -v PATTERN 來去掉吻合的結果。

> ps -ef | grep <string> | grep -v grep

套用上述的例子,可以得到下列結果

e.q.
> ps -ef | grep init | grep -v grep

root         1     0  0  2016 ?        00:00:11 /sbin/init

更簡單的方法

透過一個正規表示式的小技巧,我們可以這樣下指令。

> ps -ef | grep [s]tring  // (1)
  1. 將要過濾字串的第一個字以 [] 包裹起來,

同上述的例子,可以得到下列結果

e.q.
> ps -ef | grep [i]nit

root         1     0  0  2016 ?        00:00:11 /sbin/init

這是因為原本下 grep init 時,在 ps 的結果中輸出為

root     17064 24257  0 15:51 pts/2    00:00:00 grep --color=auto init

而下 grep [i]nit 時,在 ps 的結果中輸出為

root     17064 24257  0 15:51 pts/2    00:00:00 grep --color=auto [i]nit

而 PATTERN [i]nit 吻合 init 卻不吻合 [i]nit,所以就能濾掉 grep 本身的 process。

閱讀在雲端