我想計算給定用戶啟動的非睡眠進程的數量。我知道睡眠進程是狀態變數中帶有“S”或“D”的進程ps
。我還知道我可以從包含變數的列表中計算進程user
:state
ps -e -o user,state | grep -c 'username'
同樣,我知道我可以透過以下方式計算睡眠進程:
ps -e -o user,state | grep -c 'S|D'
但是,我不知道如何使用這兩個資訊來計算使用者啟動的非睡眠進程username
。
答案1
在命令的輸出中
ps -e -o user,state
狀態是每行的最後一個字元。所以我們基本上計算包含給定使用者名稱的行,然後既不以 anS
也不以 a結尾D
:
ps -e -o user,state | grep -c -E 'pduck.*[^SD]$'
這將找到(或計算)包含單字pduck
(我的用戶名)並且不以S
or結尾的所有行D
。
這-E
是grep
理解正規表示式所必需的。
@steeldriver在評論中建議“選擇使用者-u pduck
並從輸出欄位清單中完全忽略它”。我同意,這更好,但是我們需要刪除開關,-e
因為這將選擇所有進程(而不僅僅是 user 的進程pduck
):
ps -u pduck -o state | grep -c -E '[^SD]$'