使用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' ,原因有三:

  1. 可以使用*字符创建用户:

      $ 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.pdfmyuser1.txt 。 不是你的预期,对吧?

  2. 第二个原因 – 如果您登录多个用户名(某些系统管理员可能会这样做)或打开多个终端,您可能会对whoami输出感到困惑:

     $ whoami root $ logname xieerqi 

    如果您的意图是过滤掉root进程,这将有效,但如果您以root用户身份登录但又希望过滤掉管理员用户的进程 – whoami将不会为您提供所需的内容。

  3. 可以取消设置环境变量:

     $ unset USER $ echo "empty $USER ?" empty ? 

那么我们从中学到了什么呢?

  • 引用变量!
  • 知道你实际登录的是什么以及你的意图是什么
  • 小心把东西传给grep
  • 尝试尽可能使用命令及其选项