過濾 ps 輸出不要包含 grep 自己
linux shell grep -在使用 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)
-
真正要查的結果
-
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)
-
將要過濾字串的第一個字以
[]
包裹起來,
同上述的例子,可以得到下列結果
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。