Smile Asked: 2017-12-07 17:27:41 +0800 CST2017-12-07 17:27:41 +0800 CST 2017-12-07 17:27:41 +0800 CST 使用 grep 和 whoami 列出不属于当前用户的进程 772 ps aux --sort=-%cpu | grep -v 'whoami'命令应该输出不是由有效用户启动的进程。但是,它会打印出我的用户以及其他用户的进程。请解释什么是错的。 command-line 2 个回答 Voted Best Answer steeldriver 2017-12-07T17:36:44+08:002017-12-07T17:36:44+08:00 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 Sergiy Kolodyazhnyy 2017-12-07T18:09:59+08:002017-12-07T18:09:59+08:00 正如Steeldriver 的回答已经解释的那样,您的命令是错误的,因为它会过滤文字 string 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 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 通配符扩展myuser1*为myuser1.pdfand 。myuser1.txt不是你所期望的,对吧? 第二个原因 - 如果您登录多个用户名(某些系统管理员可能会这样做)或打开多个终端,您可能会对whoami输出感到困惑: $ whoami root $ logname xieerqi 如果您的意图是过滤掉root进程,这将起作用,但如果您已登录root但还想过滤掉您的管理员用户的进程 -whoami将不会给您想要的东西。 可以取消设置环境变量: $ unset USER $ echo "empty $USER ?" empty ? 那么我们从中学到了什么? 引用变量! 知道您实际登录的身份以及您的意图是什么 小心传递东西grep 尽可能使用命令及其选项
grep -v 'whoami'
排除与文字字符串匹配的行whoami
如果要排除与
whoami
命令输出匹配的行,则需要将单引号替换为反引号或者改用
$(...)
命令替换的形式grep
或者,您可以通过直接否定用户选择来完全跳过:正如Steeldriver 的回答已经解释的那样,您的命令是错误的,因为它会过滤文字 string
whoami
,您可以使用grep -v "$(whoami)"
; 你也可以使用grep -v "$USER"
来达到预期的效果。另一种更好的方法是让
ps
处理过滤-Nu
如 steeldriver 所示或top
:但是,我建议您使用实际登录名 -文字字符串- 如下
grep -v 'myuser'
三个原因:可以创建具有
*
字符的用户:为什么这很重要?因为当您使用
$()
不带引号的情况下,如果存在可能包含部分用户名的文件,通配符可能会成为 shell globbing 的问题,那么命令将中断:请注意 shell 如何根据 shell 通配符扩展
myuser1*
为myuser1.pdf
and 。myuser1.txt
不是你所期望的,对吧?第二个原因 - 如果您登录多个用户名(某些系统管理员可能会这样做)或打开多个终端,您可能会对
whoami
输出感到困惑:如果您的意图是过滤掉
root
进程,这将起作用,但如果您已登录root
但还想过滤掉您的管理员用户的进程 -whoami
将不会给您想要的东西。可以取消设置环境变量:
那么我们从中学到了什么?
grep