Lorsque je recherche un processus qui n'existe pas, par exemple
$ ps aux | grep fnord
wayne 15745 0.0 0.0 13580 928 pts/6 S+ 03:58 0:00 grep fnord
De toute évidence, je me fiche de grep - cela a autant de sens que de chercher le ps
processus!
Comment puis-je empêcher que grep apparaisse dans les résultats?
ps aux |grep
parpgrep
(oupgrep -f
).ps aux
, je m'attends). La question est donc de savoir comment évitergrep fnord
de s’afficher comme un processus en cours car je ne suis évidemment pas intéressé par celui- ci.Réponses:
Il s'avère qu'une solution a été trouvée dans le trousseau .
En mettant les crochets autour de la lettre et les guillemets autour de la chaîne, vous recherchez l'expression régulière, qui dit: "Recherchez le caractère" f "suivi de" nord "."
Mais puisque vous mettez les crochets dans le motif 'f' est maintenant suivi de ']',
grep
ne sera donc pas affiché dans la liste des résultats. Neato!la source
grep [f]nord
. Cependant, cette ligne[f]nord
n'interviendra pas via le filtre grep, car la chaîne ne correspond pas à l'expression régulière[f]nord
.ps aux | grep fnord | grep -v grep
... ce qui semble avoir déjà été suggéré par quelques personnes ... lol[
même en bash. Essayez-le avec un fichier appeléfnord
dans le répertoire en cours.ps
peut être un vieux truc, mais ce n’est pas fiable. Utilisezpgrep
si disponible.fnord
et un programme appelésafnorde
. Ou il y a un utilisateur appelébfnord
, et vous finissez par tuer tous ses processus. Etc.Une autre option que j'utilise (en particulier pour vérifier si un processus est en cours d'exécution) est la
pgrep
commande. Cela recherchera un processus correspondant, mais ne listera pas une ligne grep pour la recherche. J'aime ça parce que c'est un moyen rapide de chercher, sans regexing ni échapper à rien.la source
-f
option soit plus semblableps | grep
.pgrep -f
ressemblera plusps -f | grep
.-l
argument pour faire apparaître la commande qui correspond.ps | grep '[f]nord'
est intelligent et vénérable, mais pgrep a raison .ps $(pgrep cmd) ...
si `pgrep manque d’options (cela ne fonctionnera pas pour un ensemble de commandes vide).La solution idéale est celle présentée par BriGuy
Mais si vous ne voulez pas faire cela, vous pouvez simplement exclure toutes les lignes qui correspondent à grep avec:
la source
pgrep
ou en trouver une autre;)Ce n'est pas la solution la plus élégante mais vous pouvez le faire:
$ ps aux | grep fnord | grep -v grep
la source
grep
dans votre phrase. Cela ne montrera pas ce processus. Par exemple, supposons qu'un fichier appeléfoo_grep_bar.txt
soit en cours de modification par lanano
commande. Donc, il y a un processus en cours d'exécution:root 14908 0.0 0.0 110012 1692 pts / 3 S + Oct31 0:00 nano foo_grep_bar.txt
selon cette réponse, cela ne fonctionnera pas:$ ps aux | grep nano | grep -v grep
car il y a un mot grep dans votre nom de fichier.grep fnord
non seulement àgrep
savoir$ ps aux | grep fnord | grep -v "grep fnord"
En zsh,
grep fnord =(ps aux)
.L'idée est, tout d'abord
ps aux
, de placer le résultat dans un fichier, puis de l'utilisergrep
sur ce fichier. Seulement, nous n'avons pas de fichier, car nous utilisons la "substitution de processus" de zsh.Pour illustrer, essayez
Le résultat devrait être le même.
Commentaire général sur certaines des autres réponses. Certains sont trop compliqués et / ou longs à taper. Ce n’est pas seulement une question d’avoir raison, cela devrait aussi être utilisable. Mais cela ne signifie pas que certaines de ces solutions sont mauvaises; seulement, ils doivent être enveloppés dans une mini-interface utilisateur pour les rendre utilisables.
la source
<(command)
.grep grep =(ps aux)
ne montre aucune ligne.print -l ${(M)${(f)¨$(ps aux)¨}:#*fnord*}
la source
| grep $(echo fnord)
ne suffisait pas? vous demandez également à sed de rechercher et de remplacer chaque caractère dans "fnord" par sa propre valeur? ^^ félicitations. Je parie que je peux en faire encore plus, mais ce ne sera probablement pas aussi drôle ^^ps aux | grep '[^]]fnord'
éviterait cette gymnastique.Recherche de processus
Si vous recherchez uniquement des
fnord
processus, vous pouvez utiliser l'-C
option pour sélectionner par nom de commande:Cela peut être mélangé avec les options de format de style BSD et POSIX à votre convenance. Voir la page de manuel ps pour une liste complète.
Vous cherchez autre chose?
Si vous avez besoin de quelque chose de plus avancé que la recherche exacte d'un nom de commande, ne perdez pas espoir! Cela peut encore être fait sur le
ps
côté du tuyau. Tout ce que nous avons à faire est de direps
d'exclure lesgrep
processus du résultat:-C grep
sélectionne tous les processus grep et-N
annule la sélection. Cela peut être utilisé pour rechercher des arguments de commande, une partie d'un nom de commande ou des expressions régulières plus complexes.la source
ps
mais-C
n’est pas spécifié par POSIX et a une signification complètement différente sous BSDMa réponse est une variation de la réponse typique pour la recherche de "foobar" dans une liste "ps". L'argument de "-A" "ps" est plus portable que "aux", je crois, mais ce changement n'a aucune incidence sur la réponse. La réponse typique ressemble à ceci:
Au lieu de cela, j'utilise ce modèle:
L'avantage principal est qu'il est plus facile d'écrire des scripts basés sur ces modèles, car vous concaténez simplement une chaîne statique "[^]]" avec le modèle que vous recherchez. Vous n'avez pas besoin de retirer la première lettre de la chaîne, de l'insérer entre les accolades puis de la concaténer à nouveau. Lors de la création de scripts dans un shell, il est plus simple de coller "[^]]" devant le motif recherché. Le tranchage de cordes dans Bash est une chose laide, ma variante l’évite donc. Cette variation indique de montrer les lignes où le motif correspond SANS un crochet de droite]. Etant donné que le modèle de recherche pour exclure un crochet ajoute le crochet au modèle, il ne se correspondra jamais.
Ainsi, vous pourriez écrire une commande 'psgrep' portable comme suit. Ici, je tiens compte des différences entre Linux, OS X BSD et d’autres. Cela ajoute les en-têtes de colonne à partir de 'ps', fournit un format 'ps' plus personnalisé qui convient mieux à mes besoins et affiche les processus listant extra, extra wide afin qu'aucun des arguments de ligne de commande ne manque. Eh bien, la plupart ne sont pas manqués. Java étant Java, il fait souvent les choses de la pire façon possible, de sorte que certains services java fonctionneront au-delà de la longueur maximale autorisée des arguments que la table de processus va suivre. Je crois que c'est 1024 caractères. La longueur autorisée par commande permettant de démarrer un processus est beaucoup plus longue, mais la table des processus du noyau ne prend pas la peine de garder trace de tout ce qui dépasse 1K. Une fois la commande lancée, le nom de la commande et la liste des arguments isn '
la source
La manière la plus simple, agnostique vis-à-vis du shell, serait de le stocker dans une variable:
Call-out: @ La
grep fnord =(ps aux)
réponse d'EmanuelBerg est de loin la plus élégante, bien qu'elle soit nécessairezsh
. Je l'ai brièvement eu dans mes fichiers rc, mais bash se plaint de cette syntaxe même malgré une condition qui empêcherait son évaluation.De mes fichiers rc, j'ai une version non sensible à la casse qui prend l'argument de grep:
Code walk, une balle par ligne de code:
ps
sortie commentée (dans unelocal
variable afin qu'elle disparaisse lorsque la fonction retourne)$PS_OUTPUT
et supprimez tout après le premier saut de ligne (regex equiv:)s/\n.*$//msg
. Cela nous empêche de grepper le titreps
sortie avec tout sauf la première ligne (regex equiv:)s/^.*\n//m
et grep son contenu avec-i
pour insensible à la casse et avec tous les arguments transmis cette fonction (dans le cas d'aucun argument^
, qui correspond au début de toute ligne tout)la source
Voici une version étendue de la
grep -v grep
solution, filtrant tous lesgrep
processus qui n'exécutent pas depuis plus d'une seconde, ce qui constitue une amélioration par rapport à "supprime simplement toutes les occurrences degrep
".respectivement
Cela peut ne pas être portable et dépend du format de sortie réel de votre
ps
commande locale .Vous voudrez peut-être combiner cela avec une
grep
sortie colorée pour plus de commodité:la source
Peut-être le temps d'utiliser une vraie séquence cette fois. L'utilisation de tuyaux le rend parallèle.
C'est moche, car il y aura un fichier
f
, mais ce n'est pas de ma faute s'il n'y a pas de syntaxe pour les processus séquentiels pour lesquels vous souhaitez toujours utiliser le résultat d'un processus exécuté précédemment.Suggestion pour la syntaxe d'un opérateur séquentiel:
la source
ps
sorties avant moigrep
, j'utilise plus de mémoire (ou de disque) plus longtemps.Comme d'autres l'ont indiqué, la commande pgrep renverra le PID (ID de processus) des processus en fonction du nom et d'autres attributs. Par exemple,
vous donnera les PID, délimités par une virgule (,) de tous les processus dont les noms correspondent exécutés par l'utilisateur
<username>
. Vous pouvez utiliser le commutateur -x avant pour ne renvoyer que des correspondances exactes.Si vous souhaitez obtenir plus d'informations sur ces processus (comme le fait d'exécuter les options aux depuis ps implique), vous pouvez utiliser l'option -p avec ps, qui correspond au PID. Donc, par exemple,
donnera des informations détaillées sur tous les PID associés à la commande pgrep.
la source
ps
échoue sipgrep
retourne un ensemble vide. J'ai une réponse qui s'appuie sur la vôtre et tente de résoudre ce problème.Voici un exemple simple pour trouver le PID de
ssh-agent
nom d'utilisateur sans afficher le PID dugrep
processus lui-même:Si vous voulez par exemple tuer
ssh-agent
pour l'utilisateur actuel, vous pouvez utiliser la commande suivante:Pour créer un alias pratique, ajoutez à votre fichier ~ / .bashrc ou ~ / .zshrc le code suivant:
Et pour utiliser alias, voici des exemples pour forcer tout le monde à apprendre les expressions régulières:
PS Je n’ai testé ces commandes que sur Ubuntu et Gentoo.
la source
"${USER}.* /usr/bin/ssh-agent"
. Cela fonctionne parce que vous avez dit[ ]
; vous utilisez simplement le mécanisme de la réponse acceptée. Vous pourriez aussi bien justegrep "[s]sh-agent"
.L'utilisation de l'option -x (correspondance exacte) a fonctionné pour moi. Je l'ai combiné avec -f (ligne de commande complète) afin de pouvoir assortir mon processus précisément avec:
la source
Vous pouvez le faire facilement, simplement en définissant un ALIAS dans votre
.bashrc
genre:la source
grep
utilisation dans d'autres cas. Essayezecho I love grep | grep love
.