AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 983955
Accepted
Smile
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 2 个回答
  • 3061 Views

2 个回答

  • Voted
  1. 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
    
    • 7
  2. 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'三个原因:

    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 通配符扩展myuser1*为myuser1.pdfand 。myuser1.txt不是你所期望的,对吧?

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

      $ whoami
      root
      $ logname
      xieerqi
      

      如果您的意图是过滤掉root进程,这将起作用,但如果您已登录root但还想过滤掉您的管理员用户的进程 -whoami将不会给您想要的东西。

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

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

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

    • 引用变量!
    • 知道您实际登录的身份以及您的意图是什么
    • 小心传递东西grep
    • 尽可能使用命令及其选项
    • 3

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve