Plus élégant " ps aux / grep - v grep"

Quand je vérifie la liste des processus et "grep" ceux qui sont intéressants pour moi, le grep lui-même est également inclus dans les résultats. Par exemple, pour lister les terminaux:

$ 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

Normalement, j'utilise ps aux | grep something | grep -v grep pour se débarrasser de la dernière entrée... mais il n'est pas élégant :)

Avez-vous un hack plus élégant pour résoudre ce problème (à part envelopper toute la commande dans un script séparé, ce qui n'est pas mal non plus)

157
demandé sur Jakub M. 2012-02-21 14:15:50

8 réponses

La technique habituelle est la suivante:

ps aux | egrep '[t]erminal'

Cela correspond aux lignes contenant terminal, ce qui n'est pas le cas de egrep '[t]erminal'! Il travaille également sur beaucoup saveurs D'Unix.

258
répondu Johnsyweb 2017-11-08 00:53:09

Utilisez pgrep . Il est plus fiable.

50
répondu DarkDust 2015-10-12 14:02:18

Cette réponse s'appuie sur un avant pgrep réponse. Il s'appuie également sur un autre réponse combinant l'utilisation de ps avec pgrep. Voici quelques exemples de formation pertinents:

$ 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]

Ce qui précède peut être utilisé comme une fonction :

$ 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

Comparer avec l'utilisation de ps avec grep. La ligne d'en-tête utile n'est pas imprimée:

$  ps aux | grep [s]shd
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D
23
répondu A-B-B 2018-02-20 15:09:20

Vous pouvez filtrer dans la commande ps, par exemple

ps u -C gnome-terminal

(ou recherchez dans / proc avec find etc.)

7
répondu Andreas Frische 2015-05-05 15:25:59

Un plus alternative:

ps -fC terminal

Voici les options:

 -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.
3
répondu TaXXoR 2013-09-30 07:57:03

L'utilisation de crochets pour entourer un caractère dans le modèle de recherche exclut le processus grep car il ne contient pas l'expression rationnelle correspondante.

$ 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
3
répondu auntchilada 2015-02-13 18:33:16

Avertissement: je suis l'auteur de cet outil, mais...

Je voudrais utiliser 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

Sauf pour trouver des processus avec une interface de ligne de commande sensible, il fait aussi beaucoup d'autres choses utiles, plus de détails sur la page du projet.

Fonctionne sur Linux et OS X, facilement installé:

curl -Ls https://github.com/walles/px/raw/python/install.sh | bash
2
répondu Johan Walles 2017-03-10 09:20:20

Une autre option consiste à modifier votre .bash_profile (ou tout autre fichier dans lequel vous conservez des alias bash) pour créer une fonction qui grep 'grep' hors des résultats.

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

alias grep='mygrep'

Le grep -v grep doit être le premier sinon votre --color=auto NE FONCTIONNERA PAS pour une raison quelconque.

Cela fonctionne si vous utilisez bash; si vous utilisez un shell différent YMMV.

-2
répondu FlyingCodeMonkey 2016-02-22 17:22:33