更优雅的“ps aux |” grep -v grep“

当我检查进程列表并“grep”出对我有意思的内容时, grep本身也包含在结果中。 例如,要列出terminal:

 $ ps aux | grep terminal user 2064 0.0 0.6 181452 26460 ? Sl Feb13 5:41 gnome-terminal --working-directory=.. user 2979 0.0 0.0 4192 796 pts/3 S+ 11:07 0:00 grep --color=auto terminal 

通常我使用ps aux | grep something | grep -v grep ps aux | grep something | grep -v grep ps aux | grep something | grep -v grep摆脱最后一项…但它不是优雅 🙂

你有一个更优雅的黑客来解决这个问题(除了包装所有的命令到一个单独的脚本,这也是不错的)

通常的技术是这样的:

 ps aux | egrep '[t]erminal' 

这将匹配包含terminal ,其中egrep '[t]erminal'不! 它也适用于Unix的许多口味。

使用pgrep 。 这更可靠。

这个答案build立在一个先前的pgrep 答案 。 它也build立在另一个结合使用pspgrep 答案上 。 这里有一些相关的训练实例:

 $ pgrep -lf sshd 1902 sshd $ pgrep -f sshd 1902 $ ps up $(pgrep -f sshd) USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1902 0.0 0.1 82560 3580 ? Ss Oct20 0:00 /usr/sbin/sshd -D $ ps up $(pgrep -f sshddd) error: list of process IDs must follow p [stderr output truncated] $ ps up $(pgrep -f sshddd) 2>&- [no output] 

以上可以作为一个function使用:

 $ psgrep() { ps up $(pgrep -f $@) 2>&-; } $ psgrep sshd USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1902 0.0 0.1 82560 3580 ? Ss Oct20 0:00 /usr/sbin/sshd -D 

与使用psgrep比较 有用的标题行不会被打印:

 $ ps aux | grep [s]shd root 1902 0.0 0.1 82560 3580 ? Ss Oct20 0:00 /usr/sbin/sshd -D 

你可以在ps命令中进行过滤,例如

 ps u -C gnome-terminal 

(或通过查找 / proc 查找等)

另一个select :

 ps -fC terminal 

这里的选项:

  -f does full-format listing. This option can be combined with many other UNIX-style options to add additional columns. It also causes the command arguments to be printed. When used with -L, the NLWP (number of threads) and LWP (thread ID) columns will be added. See the c option, the format keyword args, and the format keyword comm. -C cmdlist Select by command name. This selects the processes whose executable name is given in cmdlist. 

使用括号来包围search模式中的字符,排除了grep进程,因为它不包含匹配的正则expression式。

 $ ps ax | grep 'syslogd' 16 ?? Ss 0:09.43 /usr/sbin/syslogd 18108 s001 S+ 0:00.00 grep syslogd $ ps ax | grep '[s]yslogd' 16 ?? Ss 0:09.43 /usr/sbin/syslogd $ ps ax | grep '[s]yslogd|grep' 16 ?? Ss 0:09.43 /usr/sbin/syslogd 18144 s001 S+ 0:00.00 grep [s]yslogd|grep 

免责声明:我是这个工具的作者,但…

我会用px :

 ~ $ px atom PID COMMAND USERNAME CPU RAM COMMANDLINE 14321 crashpad_handler walles 0.01s 0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Electron Framework.framework/Resources/crashpad_handler --database= 16575 crashpad_handler walles 0.01s 0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Electron Framework.framework/Resources/crashpad_handler --database= 16573 Atom Helper walles 0.5s 0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/MacOS/Atom Helper --type=gpu-process --cha 16569 Atom walles 2.84s 1% /Users/walles/Downloads/Atom.app/Contents/MacOS/Atom --executed-from=/Users/walles/src/goworkspace/src/github.com/github 16591 Atom Helper walles 7.96s 2% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/MacOS/Atom Helper --type=renderer --no-san 

除了使用明智的命令行界面来查找进程之外,它还做了很多其他有用的事情, 在项目页面上有更多的细节。

适用于Linux和OS X,轻松安装:

 curl -Ls https://github.com/walles/px/raw/python/install.sh | bash 

另一个select是编辑你的.bash_profile (或其他你保存bash别名的文件)来创build一个greps'grep'结果的函数。

 function mygrep { grep -v grep | grep --color=auto $1 } alias grep='mygrep' 

grep -v grep必须是第一的,否则你的--color=auto将不能工作。

如果你使用bash的话,这将起作用。 如果你使用不同的shell YMMV。