ps aux --sort=-%cpu | grep -v 'whoami'
命令应该输出未由有效用户启动的进程。但是,它打印出我的用户以及其他用户的进程。请解释哪里出了问题。
答案1
grep -v 'whoami'
排除与文字字符串匹配的行whoami
如果要排除与命令输出匹配的行whoami
,则需要将单引号替换为反引号
ps aux --sort=-%cpu | grep -vFe `whoami`
或者使用$(...)
命令替换的形式
ps aux --sort=-%cpu | grep -vFe "$(whoami)"
grep
或者,您可以通过直接否定用户选择来完全跳过:
ps -Nu `whoami` --sort=-%cpu u
答案2
作为steeldriver 的回答已经解释过了,你的命令是错误的,因为它会过滤文字字符串 whoami
,您可以使用grep -v "$(whoami)"
;您也可以使用 grep -v "$USER"
来达到预期的效果。
另一种更好的方法是让ps
处理过滤,-Nu
如steeldriver所示,或者top
:
$ top -u '!root' -n 1
不过,我建议你使用实际的登录名 -文字字符串-grep -v 'myuser'
原因有三:
可以创建具有
*
以下角色的用户:$ sudo -p ">" useradd -s /bin/bash -p "$(mkpasswd -m SHA-512 '123')" 'myuser1*' > $ su 'myuser1*' Password: myuser1*@eagle:/home/xieerqi$
为什么这很重要?因为当你使用时
$()
没有引用,如果存在可能包含部分用户名的文件,通配符可能会成为 shell 通配符的问题,那么命令将会中断:myuser1*@eagle:/home/xieerqi$ ps aux | strace -e execve grep -v $(whoami) > /dev/null execve("/bin/grep", ["grep", "-v", "myuser1.pdf", "myuser1.txt"], [/* 82 vars */]) = 0 +++ exited with 1 +++
注意 shell 如何根据 shell 通配符扩展
myuser1*
为myuser1.pdf
和。这不是你所期望的,对吧?myuser1.txt
第二个原因 - 如果您登录多个用户名(某些系统管理员可能会这样做)或打开多个终端,您可能会对
whoami
输出感到困惑:$ whoami root $ logname xieerqi
如果您的目的是过滤掉
root
进程,这将起作用,但如果您已登录但root
想要过滤掉管理员用户的进程 - 这whoami
将不会给您您想要的东西。可以取消设置环境变量:
$ unset USER $ echo "empty $USER ?" empty ?
那么我们从中学到了什么?
- 引用变量!
- 知道你实际登录的身份以及你的意图是什么
- 小心传递东西给
grep
- 尽可能尝试使用命令及其选项