使用grep和whoami列出当前用户不拥有的进程
ps aux --sort=-%cpu | grep -v 'whoami'
ps aux --sort=-%cpu | grep -v 'whoami'
命令应该输出非有效用户启动的进程。 但是,它会打印出我的用户进程以及其他用户的进程。 请解释一下是什么问题。
grep -v 'whoami'
排除与文字字符串whoami
相匹配的行
如果要排除与whoami
命令输出匹配的行,则需要用反引号替换单引号
ps aux --sort=-%cpu | grep -vFe `whoami`
或者使用$(...)
forms的命令替换
ps aux --sort=-%cpu | grep -vFe "$(whoami)"
或者,您可以通过直接否定用户选择来完全跳过grep
:
ps -Nu `whoami` --sort=-%cpu u
由于steeldriver的答案已经解释过,你的命令是错误的,因为它过滤了文字字符串 whoami
,你可以使用grep -v "$(whoami)"
; 你也可以使用grep -v "$USER"
来达到预期的效果。
另一种更好的方法是让ps
在-Nu
驱动器显示或top
使用-Nu
处理过滤:
$ 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 globbing的问题,那么命令将会中断: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 globbing将
myuser1*
扩展为myuser1.pdf
和myuser1.txt
。 不是你的预期,对吧? -
第二个原因 – 如果您登录多个用户名(某些系统管理员可能会这样做)或打开多个终端,您可能会对
whoami
输出感到困惑:$ whoami root $ logname xieerqi
如果您的意图是过滤掉
root
进程,这将有效,但如果您以root
用户身份登录但又希望过滤掉管理员用户的进程 –whoami
将不会为您提供所需的内容。 -
可以取消设置环境变量:
$ unset USER $ echo "empty $USER ?" empty ?
那么我们从中学到了什么呢?
- 引用变量!
- 知道你实际登录的是什么以及你的意图是什么
- 小心把东西传给
grep
- 尝试尽可能使用命令及其选项