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 me débarrasser de la dernière entrée ... mais ce n'est pas élégant :)
Avez-vous un hack plus élégant pour résoudre ce problème (à part envelopper toutes les commandes dans un script séparé, ce qui n'est pas mal non plus)
ps ux | awk '/name/ && !/awk/ {print $2}'
grep -v grep
partie?grep -v grep
exclutgrep
des résultats grep. Si grep est utilisé en combinaison avec ps, alors le processus grep (avec les arguments grep) sera également affiché, encombrant vos résultats. grep -v grep est un moyen courant d'éviter celaRéponses:
La technique habituelle est la suivante:
Cela correspondra aux lignes contenant
terminal
, ce quiegrep '[t]erminal'
n'est pas le cas! Il fonctionne également sur de nombreuses versions d'Unix.la source
ps aux | grep '[r]oot'
. Quelqu'un sait-il pourquoi?| grep '[t]erminal'
sélectionne n'importe quelle ligne contenant le mot 'terminal' sans mettre le mot 'terminal' dans la liste des processus. Avec| grep '[r]oot'
quoi essayez-vous et comment cela ne fonctionne-t-il pas? Il y a probablement une meilleure solution.grep '[t]erminal'
correspondra aux lignes contenantterminal
. La sortie deps aux
aura une ligne avecgrep '[t]erminal'
(avec les crochets), qui ne contient pas la chaîneterminal
(sans la même chose).Utilisez pgrep . C'est plus fiable.
la source
pgrep
ne fonctionnera pas si je recherche par exempleps aux | grep 'ssh options'
pgrep -f
?pgrep
correspond uniquement le modèle au nom du processus. Pour correspondre à l'ensemble de la commande, utilisez l'-f
indicateur.pgrep
renvoie uniquement les ID de processus.pgrep -fl
(mais ne pouvaient pas voir la pleine cmdline sans-f
correspondre à la pleine cmdline, détails: serverfault.com/a/619788/44183 ). Mais oui, si vous avez besoin d'autres informations à côté de pid, cmdline, vous avez besoinps
. Peut les combiner:ps -p $(pgrep -f foo)
Cette réponse s'appuie sur une
pgrep
réponse antérieure . Il s'appuie également sur une autre réponse combinant l'utilisation deps
avecpgrep
. Voici quelques exemples de formation pertinents:Ce qui précède peut être utilisé comme une fonction :
Comparez avec l'utilisation
ps
degrep
. La ligne d'en-tête utile n'est pas imprimée:la source
-d
option pour spécifier un séparateur; par exempleps -fp$(pgrep -d , getty)
ps uxp `pgrep <process>`
Notez que celap
doit être le dernier paramètre (c'est-à-dire,pux
ne fonctionnera pas)grep
faitVous pouvez filtrer dans la commande ps, par exemple
(ou recherchez dans / proc avec find etc.)
la source
ps -C <command>
correspondra à la commande exacte. Lorsqu'il est utilisé avec les optionsa
oux
, il signale tous les processus, cara
etx
répertorie les processus en plus de l'ensemble des processus mis en correspondance par d'autres moyens.logind
poursystemd-logind
, ou pour faire correspondre des arguments.Encore une alternative :
Voici les options:
la source
-C
option a déjà été suggérée dans la réponse de @Andreas Frishe publiée plus d'un an et demi plus tôt…Avertissement: je suis l'auteur de cet outil, mais ...
J'utiliserais px :
Sauf pour trouver des processus avec une interface de ligne de commande sensible, il fait également beaucoup d'autres choses utiles, plus de détails sur la page du projet .
Fonctionne sous Linux et OS X, s'installe facilement:
la source
L'utilisation de crochets pour entourer un caractère dans le modèle de recherche exclut le
grep
processus car il ne contient pas l'expression régulière correspondante.la source
Selon le cas d'utilisation ultime, vous préférez souvent Awk à la place.
Cela est particulièrement vrai lorsque vous avez quelque chose comme
où, évidemment, l'expression régulière peut être prise en compte dans le script Awk de manière triviale:
Mais vraiment, ne réinventez pas cela vous-même.
pgrep
et les amis existent depuis longtemps et gèrent bien mieux que la plupart des réimplémentations ad hoc.la source
Une autre option consiste à éditer votre
.bash_profile
(ou un autre fichier dans lequel vous conservez les alias bash) pour créer une fonction qui grep 'grep' hors des résultats.Le
grep -v grep
doit être le premier sinon vous--color=auto
ne fonctionnerez pas pour une raison quelconque.Cela fonctionne si vous utilisez bash; si vous utilisez un autre shell YMMV.
la source
function grep { command grep -v grep | command grep --color=auto "$@"; }
(notez également la correction de l'argument et la citation). Cependant, cela est interrompu en ce que toute non-ps
invocation degrep
ne fonctionnera plus (les arguments sont transmis de manière incorrecte). Quoi qu'il en soit, une fonction beaucoup plus utile serait celle qui modifie l'expression rationnelle pour qu'elle ne corresponde pas à elle-même, plutôt que de filtrergrep
lesgrep
résultats séparément. Et bien sûr, inventer de nouvelles solutions à un problème qui a été correctement résolu il y a des décennies n'est pas très productif.