Wenn ich nach einem Prozess suche, der nicht existiert, z
$ ps aux | grep fnord
wayne 15745 0.0 0.0 13580 928 pts/6 S+ 03:58 0:00 grep fnord
Grep interessiert mich natürlich nicht - das ist genauso sinnvoll wie die Suche nach dem ps
Prozess!
Wie kann ich verhindern, dass grep in den Ergebnissen angezeigt wird?
ps aux |grep
mitpgrep
(oderpgrep -f
).ps aux
ich erwarte das Warten auf die Ausgabe von ). Die Frage ist also , wie man verhindert , dass nichtgrep fnord
angezeigt werden , als ein laufenden Prozess , weil offensichtlich ich nicht interessiert bin , dass ein.Antworten:
Es stellte sich heraus, dass es eine Lösung im Schlüsselbund gibt .
Indem Sie die Klammern um den Buchstaben und die Anführungszeichen um die Zeichenfolge setzen, suchen Sie nach dem regulären Ausdruck, der lautet: "Suchen Sie das Zeichen 'f', gefolgt von 'nord'."
Da Sie jedoch die Klammern in das Muster 'f' gesetzt haben, folgt jetzt ']', sodass
grep
es nicht in der Ergebnisliste angezeigt wird. Neato!quelle
grep [f]nord
. Diese Zeile wird jedoch nicht über den grep-Filter eingehen, da die Zeichenfolge[f]nord
nicht mit dem regulären Ausdruck übereinstimmt[f]nord
.ps aux | grep fnord | grep -v grep
... was anscheinend schon von ein paar Leuten vorgeschlagen wurde ... lol[
Even in Bash zitieren . Probieren Sie es mit einer Datei aus, diefnord
im aktuellen Verzeichnis aufgerufen wird .ps
ist zwar ein alter Trick, aber unzuverlässig. Verwenden Sie,pgrep
falls verfügbar.fnord
und ein Programm namenssafnorde
. Oder es wird ein Benutzer angerufenbfnord
, und Sie beenden alle seine Prozesse. Etc.Eine andere Option, die ich verwende (insbesondere, um zu sehen, ob ein Prozess ausgeführt wird), ist der
pgrep
Befehl. Dies sucht nach einem passenden Prozess, listet jedoch keine grep-Zeile für die Suche auf. Ich mag es, weil es eine schnelle Art der Suche ist, ohne regexen oder irgendetwas entgehen zu müssen.quelle
-f
Option mehr wirdps | grep
.pgrep -f
wird eher so aussehenps -f | grep
.-l
Argument, mit dem der übereinstimmende Befehl angezeigt werden soll.ps | grep '[f]nord'
ist klug und ehrwürdig, aber pgrep ist richtig .ps $(pgrep cmd) ...
wenn in `pgrep Optionen fehlen (dies funktioniert jedoch nicht für leere Befehlssätze).Die ideale Lösung ist die von BriGuy vorgestellte
Aber wenn Sie das nicht wollen, können Sie einfach alle Zeilen ausschließen, die mit grep mit übereinstimmen :
quelle
pgrep
oder eine andere finden;)Nicht die eleganteste Lösung, aber Sie könnten dies tun:
$ ps aux | grep fnord | grep -v grep
quelle
grep
in deiner Phrase gäbe . Dieser Vorgang wird nicht angezeigt. Angenommen, eine aufgerufene Dateifoo_grep_bar.txt
wird vomnano
Befehl bearbeitet . Es läuft also ein Prozess:root 14908 0.0 0.0 110012 1692 pts / 3 S + Oct31 0:00 nano foo_grep_bar.txt
Laut dieser Antwort wird dies nicht funktionieren:$ ps aux | grep nano | grep -v grep
Weil Ihr Dateiname ein Grep-Wort enthält.grep fnord
nicht nur dasgrep
heißt$ ps aux | grep fnord | grep -v "grep fnord"
In zsh
grep fnord =(ps aux)
.Die Idee ist, zuerst
ps aux
das Ergebnis in eine Datei zu schreiben und danngrep
für diese Datei zu verwenden. Nur haben wir keine Datei, da wir die "Prozessersetzung" von zsh verwenden.Versuchen Sie es zur Veranschaulichung
Das Ergebnis sollte dasselbe sein.
Allgemeiner Kommentar zu einigen der anderen Antworten. Einige sind viel zu kompliziert und / oder lang zu tippen. Es ist nicht nur eine Frage der Richtigkeit, es sollte auch brauchbar sein. Dies bedeutet jedoch nicht, dass einige dieser Lösungen schlecht sind. Sie müssen nur in eine Mini-Benutzeroberfläche eingebunden werden, damit sie verwendet werden können.
quelle
<(command)
.grep grep =(ps aux)
zeigt keine Linie.print -l ${(M)${(f)¨$(ps aux)¨}:#*fnord*}
quelle
| grep $(echo fnord)
nicht genug? Sie bitten sed auch, jedes Zeichen in "fnord" durch seinen eigenen Wert zu suchen und zu ersetzen? ^^ Glückwunsch. Ich wette, ich kann eine noch längere machen, aber es wird wahrscheinlich nicht so lustig sein ^^ps aux | grep '[^]]fnord'
würde diese Gymnastik vermeiden.Prozesse suchen
Wenn Sie nur nach
fnord
Prozessen suchen , können Sie diese über den-C
Befehlsnamen auswählen:Dies kann mit BSD- und POSIX-ähnlichen Formatoptionen gemischt werden. Eine vollständige Liste finden Sie auf der ps-Manpage .
Auf der Suche nach etwas anderem?
Wenn Sie etwas Fortgeschritteneres als die exakte Suche nach einem Befehlsnamen benötigen, verlieren Sie nicht die Hoffnung! Dies kann immer noch an der
ps
Seite des Rohrs erfolgen. Alles, was wir tun müssen, ist zu sagenps
, dassgrep
Prozesse vom Ergebnis ausgeschlossen werden sollen:-C grep
Wählt alle grep-Prozesse aus und-N
negiert die Auswahl. Dies kann verwendet werden, um nach Befehlsargumenten, Teilen eines Befehlsnamens oder komplexeren regulären Ausdrücken zu suchen.quelle
ps
,-C
wird aber nicht von POSIX spezifiziert und hat unter BSD eine völlig andere BedeutungMeine Antwort ist eine Variation der typischen Antwort für die Suche nach "foobar" in einer "ps" -Auflistung. Ich glaube, das Argument "-A" "ps" ist portabler als "aux", aber diese Änderung ist für die Antwort irrelevant. Die typische Antwort sieht so aus:
Stattdessen benutze ich dieses Muster:
Der Hauptvorteil ist, dass es einfacher ist, Skripte basierend auf diesen Mustern zu schreiben, da Sie einfach eine statische Zeichenfolge "[^]]" mit dem gewünschten Muster verketten. Sie müssen den ersten Buchstaben der Zeichenfolge nicht abstreifen, ihn dann zwischen die eckigen Klammern einfügen und ihn dann wieder zusammenfügen. Wenn Sie Skripte in der Shell schreiben, ist es einfacher, "[^]]" vor das gesuchte Muster zu kleben. Das Aufschneiden von Saiten in Bash ist eine hässliche Sache, also vermeidet meine Variante das. Diese Variante besagt, dass die Linien angezeigt werden, in denen das Muster OHNE führende eckige Klammer stimmt. Da das Suchmuster zum Ausschließen einer eckigen Klammer tatsächlich die eckige Klammer zum Muster hinzufügt, entspricht es sich selbst nie.
Sie können also einen portablen Befehl 'psgrep' wie folgt schreiben. Hier berücksichtige ich einige Unterschiede zwischen Linux, OS X BSD und anderen. Dies fügt die Spaltenüberschriften von 'ps' hinzu, stellt ein benutzerdefinierteres 'ps'-Format bereit, das meinen Anforderungen entspricht, und zeigt Prozesse an, die eine zusätzliche Breite aufweisen, sodass keines der Befehlszeilenargumente übersehen wird. Nun, die meisten werden nicht vermisst. Da Java Java ist, werden die Dinge oft auf die schlimmste Art und Weise ausgeführt, sodass einige Java-Services über die maximal zulässige Länge von Argumenten ausgeführt werden, die in der Prozesstabelle aufgezeichnet werden. Ich glaube das sind 1024 Zeichen. Die befehlsübergreifende Länge, die zum Starten eines Prozesses zulässig ist, ist viel länger, aber die Kernel-Prozesstabelle kümmert sich nicht darum, etwas über 1 KB Länge zu verfolgen. Sobald der Befehl gestartet ist, sind der Befehlsname und die Argumentliste nicht mehr vorhanden.
quelle
Die einfachste Methode zur Shell-Agnostik besteht darin, sie zuerst in einer Variablen zu speichern:
Aufruf: @ EmanuelBergs
grep fnord =(ps aux)
Antwort ist bei weitem die eleganteste, obwohl es erfordertzsh
. Ich hatte es kurz in meinen rc-Dateien, aber bash beschwert sich über diese Syntax, auch wenn eine Bedingung dies verhindern sollte.Aus meinen rc-Dateien habe ich eine Version, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird.
Code Walk, eine Kugel pro Codezeile:
ps
Ausgabe (in einerlocal
Variablen, damit sie verschwindet, wenn die Funktion zurückkehrt).$PS_OUTPUT
Alles nach dem ersten Zeilenvorschub nehmen und entfernen (regex equiv:)s/\n.*$//msg
. Dies hindert uns daran, den Titel zu begreifenps
Ausgabe mit allem außer der ersten Zeile an (regex equiv:)s/^.*\n//m
und prüfen Sie deren Inhalt mit,-i
um die Groß- und Kleinschreibung zu ignorieren und alle Argumente zu berücksichtigen, denen diese Funktion übergeben wurde (im Falle, dass keine Argumente vorhanden sind^
, die mit dem Anfang einer übereinstimmenden Zeile übereinstimmen) alles)quelle
Hier ist eine erweiterte Version der
grep -v grep
Lösung, in der allegrep
Prozesse herausgefiltert werden, die nicht länger als eine Sekunde ausgeführt wurden. Dies ist eine Verbesserung gegenüber "Verwerfen aller Vorkommen vongrep
".beziehungsweise
Dies ist möglicherweise nicht portierbar und hängt vom tatsächlichen Ausgabeformat Ihres lokalen
ps
Befehls ab.Möglicherweise möchten Sie dies mit einer farbigen
grep
Ausgabe kombinieren :quelle
Vielleicht ist es diesmal an der Zeit, eine echte Sequenz zu verwenden. Die Verwendung von Rohren macht es parallel.
Hässlich, weil es eine Datei geben wird
f
, aber es ist nicht meine Schuld, dass es keine Syntax für sequentielle Prozesse gibt, bei denen Sie immer noch die Ausgabe eines zuvor ausgeführten Prozesses verwenden möchten.Vorschlag für die Syntax eines sequentiellen Operators:
quelle
ps
Ausgabe speichern muss, bevor ich sie abspeicheregrep
, verwende ich länger mehr Speicher (oder eine Festplatte).Der Befehl pgrep gibt, wie andere angegeben haben, die PID (Prozess-ID) von Prozessen basierend auf dem Namen und anderen Attributen zurück. Zum Beispiel,
gibt die PIDs an, die durch ein Komma (,) von allen Prozessen getrennt sind, deren Name mit der Ausführung durch den Benutzer übereinstimmt
<username>
. Sie können die Option -x zuvor verwenden, um nur exakte Übereinstimmungen zurückzugeben.Wenn Sie weitere Informationen zu diesen Prozessen erhalten möchten (wie das Ausführen der Aux-Optionen von ps impliziert), können Sie die Option -p mit ps verwenden, die auf der Grundlage der PID übereinstimmt. So zum Beispiel
Gibt detaillierte Informationen zu allen PIDs aus, die mit dem Befehl pgrep übereinstimmen.
quelle
ps
schlägt fehl, wennpgrep
ein leerer Satz zurückgegeben wird. Ich habe eine Antwort, die auf Ihrer aufbaut und versucht, dieses Problem anzugehen.Hier ist ein einfaches Beispiel, um die PID
ssh-agent
für den Benutzernamen zu finden, ohne die PID desgrep
Prozesses selbst anzuzeigen :Wenn Sie zum Beispiel
ssh-agent
für den aktuellen Benutzer töten möchten, können Sie den folgenden Befehl verwenden:Fügen Sie Ihrer ~ / .bashrc- oder ~ / .zshrc-Datei den folgenden Code hinzu, um einen praktischen Alias zu erstellen:
Und um hier einen Alias zu verwenden, sind Beispiele, mit denen jeder gezwungen wird, reguläre Ausdrücke zu lernen:
PS Ich habe diese Befehle nur unter Ubuntu und Gentoo getestet.
quelle
"${USER}.* /usr/bin/ssh-agent"
. Es funktioniert, weil du gesagt hast[ ]
; Sie verwenden also nur den Mechanismus der akzeptierten Antwort. Du könntest es genauso gutgrep "[s]sh-agent"
.Die Option -x (genaue Übereinstimmung) hat bei mir funktioniert. Ich habe es mit -f (vollständige Befehlszeile) kombiniert, damit ich meinen Prozess genau mit den folgenden Kriterien abgleichen kann:
quelle
Sie können dies ganz einfach tun, indem Sie ein ALIAS
.bashrc
wie folgt definieren :quelle
grep
Verwendung in anderen Fällen. Versuchen Sie esecho I love grep | grep love
.