it-swarm.com.de

Wie kann ich verhindern, dass 'grep' in ps-Ergebnissen angezeigt wird?

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

Offensichtlich interessiert mich grep nicht - das ist genauso sinnvoll wie die Suche nach dem ps -Prozess!

Wie kann ich verhindern, dass grep in den Ergebnissen angezeigt wird?

323
Wayne Werner

Es stellt sich heraus, dass in Schlüsselbund eine Lösung gefunden wurde.

$ ps aux | grep "[f]nord"

Indem Sie die Klammern um den Buchstaben und die Anführungszeichen um die Zeichenfolge setzen, suchen Sie nach dem regulären Ausdruck, der besagt: "Finden Sie das Zeichen 'f' gefolgt von 'nord'."

Da Sie jedoch die Klammern in das Muster 'f' setzen, folgt jetzt ']', sodass grep nicht in der Ergebnisliste angezeigt wird. Neato!

463
Wayne Werner

Eine andere Option, die ich verwende (insbesondere, um zu prüfen, ob ein Prozess ausgeführt wird), ist der Befehl pgrep. Dadurch wird nach einem übereinstimmenden Prozess gesucht, jedoch keine Grep-Zeile für die Suche aufgelistet. Ich mag es, weil es eine schnelle Art der Suche ist, ohne irgendetwas neu zu formulieren oder zu entkommen.

pgrep fnord
173
BriGuy

Die ideale Lösung ist die von BriGuy

pgrep fnord 

Wenn Sie dies jedoch nicht möchten, können Sie einfach alle Zeilen ausschließen, die mit grep with übereinstimmen:

ps aux | grep -v grep | grep "fnord"
64
RSFalcon7

Nicht die eleganteste Lösung, aber Sie könnten dies tun:

$ ps aux | grep fnord | grep -v grep

26
Brandon Kreisel

In zsh grep fnord =(ps aux).

Die Idee ist, zuerst ps aux, füge das Ergebnis in eine Datei ein und verwende dann grep für diese Datei. Nur haben wir keine Datei, da wir die "Prozesssubstitution" von zsh verwenden.

Versuchen Sie es zur Veranschaulichung

ps aux > ps.txt
grep fnord ps.txt
rm ps.txt

Das Ergebnis sollte das gleiche sein.

Allgemeiner Kommentar zu einigen anderen Antworten. Einige sind viel zu kompliziert und/oder lang zu tippen. Es geht nicht nur darum, richtig zu sein, es sollte auch verwendbar sein. Das heißt aber nicht, dass einige dieser Lösungen schlecht sind. Nur müssen sie in eine Mini-Benutzeroberfläche eingebunden werden, damit sie verwendet werden können.

16
Emanuel Berg

Diese Antwort ist GNU-spezifisch . Siehe Waynes Antwort für eine allgemeinere Lösung.

Nach Prozessen suchen

Wenn Sie nur nach fnord -Prozessen suchen, können Sie mit der Option -C Nach Befehlsnamen auswählen:

ps -C fnord

Dies kann mit Formatoptionen im BSD- und POSIX-Stil nach Ihren Wünschen gemischt werden. Eine vollständige Liste finden Sie in der ps man page .

Suchen Sie etwas anderes?

Wenn Sie etwas Fortgeschritteneres als eine genaue Suche nach einem Befehlsnamen benötigen, verlieren Sie nicht die Hoffnung! Dies kann weiterhin auf der ps Seite des Rohrs erfolgen. Alles was wir tun müssen, ist ps anzuweisen, grep Prozesse vom Ergebnis auszuschließen:

ps -NC grep | grep 'fnord'

-C grep Wählt alle Grep-Prozesse aus und -N Negiert die Auswahl. Dies kann verwendet werden, um nach Befehlsargumenten, einem Teil eines Befehlsnamens oder komplexeren regulären Ausdrücken zu suchen.

7
Morgan
ps aux | grep $(echo fnord | sed "s/^\(.\)/[\1]/g")
7
yPhil

Meine Antwort ist eine Variation der typischen Antwort für die Suche nach "foobar" in einer "ps" -Liste. Das Argument von "-A" "ps" ist meiner Meinung nach portabler als "aux", aber diese Änderung ist für die Antwort irrelevant. Die typische Antwort sieht so aus:

$ ps -A -ww | grep [f]oobar

Stattdessen verwende ich dieses Muster:

$ ps -A -ww | grep [^]]foobar

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 dann den Buchstaben wieder zusammenfügen. Wenn Sie in Shell Skripte erstellen, ist es einfacher, einfach "[^]]" vor das Muster zu setzen, nach dem Sie gesucht haben. Das Schneiden von Saiten in Bash ist eine hässliche Sache, daher vermeidet meine Variation dies. Diese Variation besagt, dass die Linien angezeigt werden, in denen das Muster OHNE eine führende rechteckige Klammer übereinstimmt. Da das Suchmuster zum Ausschließen einer eckigen Klammer tatsächlich die eckige Klammer zum Muster hinzufügt, stimmt es nie mit sich selbst überein.

Sie können also einen portablen 'psgrep'-Befehl wie folgt schreiben. Hier berücksichtige ich Unterschiede zwischen Linux, OS X BSD und anderen. Dies fügt die Spaltenüberschriften von 'ps' hinzu, bietet ein benutzerdefinierteres 'ps'-Format, das meinen Anforderungen besser entspricht, und zeigt Prozesse an, die extra und extra breit aufgelistet sind, sodass keines der Befehlszeilenargumente übersehen wird. Nun, die meisten werden nicht vermisst. Java Da Java Java ist, werden die Dinge oft auf die schlechteste Art und Weise ausgeführt, sodass einige Java -Dienste über die maximal zulässige Länge von Argumenten hinausgehen, die in der Prozesstabelle enthalten sind Ich glaube, das sind 1024 Zeichen. Die Befehlslä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 wurde Der Befehlsname und die Argumentliste werden nicht benötigt, sodass das, was in der Prozesstabelle gespeichert wird, nur zur Information dient.

psgrep ()
{
    pattern=[^]]${1};
    case "$(uname -s)" in
        Darwin)
            ps -A -ww -o pid,ppid,Nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        Linux)
            ps -A -ww -o pid,ppid,tid,Nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        *)  # other UNIX flavors get a minimalist version.
            ps -A -ww | grep -i -e ${pattern}
        ;;
    esac
}
3
Noah Spurrier

Der einfachste Shell-agnostische Weg, dies zu tun, besteht darin, ihn zuerst in einer Variablen zu speichern:

PS_OUTPUT="$(ps aux)"; echo "$PS_OUTPUT" |grep fnord

Call-out: @ EmanuelBergs grep fnord =(ps aux) Antwort ist bei weitem die eleganteste, obwohl sie zsh erfordert. Ich hatte es kurz in meinen RC-Dateien, aber Bash beschwert sich über diese Syntax, trotz einer Bedingung, die ihre Auswertung verhindern sollte.


Aus meinen RC-Dateien habe ich eine Version, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird und die die Argumente von grep übernimmt:

psl() {
  local PS_OUTPUT="$(ps auxww)"
  echo "${PS_OUTPUT%%$'\n'*}" >&2  # title, in stderr to avoid pipes
  echo "${PS_OUTPUT#*$'\n'}" |grep -i "${@:-^}"
}

Code Walk, eine Kugel pro Codezeile:

  • Erfassen Sie die ausführliche ps Ausgabe (in einer local Variablen, damit sie verschwindet, wenn die Funktion zurückkehrt).
  • Zeigen Sie die erste Zeile (den Titel) im Standardfehler an, damit die Ergebnisse weiter gefiltert werden können, ohne den Titel zu beeinflussen. Die Ersetzung lautet: Nehmen Sie $PS_OUTPUT Und entfernen Sie alles nach dem ersten Zeilenvorschub (Regex-Äquiv.: s/\n.*$//msg). Dies hindert uns daran, den Titel zu erfassen
  • Zeigen Sie die Ausgabe ps mit allem außer der ersten Zeile (Regex-Äquiv.: s/^.*\n//m) An und greifen Sie den Inhalt mit -i Für die Groß- und Kleinschreibung wird nicht berücksichtigt, und mit allen Argumenten wird diese Funktion übergeben (im Falle, dass keine Argumente vorliegen, ^, Die dem Anfang einer Zeile entspricht, um mit allem übereinzustimmen)
2
Adam Katz

Hier ist eine erweiterte Version des grep -v grep Lösung, die alle grep Prozesse herausfiltert, die nicht länger als eine Sekunde ausgeführt wurden. Dies ist eine Verbesserung gegenüber "Alle Vorkommen von grep einfach verwerfen".

$ ps -ef | grep -vw "00:00:00 grep" | grep <searchTerm>

beziehungsweise

$ ps aux | grep -vw "0:00 grep" | grep <searchTerm>

Dies ist möglicherweise nicht portierbar und hängt vom tatsächlichen Ausgabeformat Ihres lokalen Befehls ps ab.

Sie können dies zur Vereinfachung mit einer farbigen Ausgabe von grep kombinieren:

$ alias grep='grep --color=auto'
1
Murphy

Vielleicht ist es diesmal an der Zeit, eine echte Sequenz zu verwenden. Die Verwendung von Rohren macht es parallel.

ps aux >f && grep tmpfs <f

Hässlich, weil es eine Datei f geben wird, 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:

ps aux ||| grep tmpfs
0
Anne van Rossum

Hier ist ein einfaches Beispiel, um die PID von ssh-agent Für den Benutzernamen zu finden, ohne die PID von grep process selbst anzuzeigen:

ps xu | grep "${USER}.*[ ]/usr/bin/ssh-agent" | awk '{print $1 $2;}'

Wenn Sie beispielsweise ssh-agent Für den aktuellen Benutzer beenden möchten, können Sie den folgenden Befehl verwenden:

kill `ps xu | grep "${USER}.*[ ]/usr/bin/ssh-agent" | awk '{print $2;}'`

Um einen praktischen Alias ​​zu erstellen, fügen Sie Ihrer ~/.bashrc- oder ~/.zshrc-Datei den folgenden Code hinzu:

function function1 () {
    ps xu | grep "$1.*$2" | awk '{print $1" "$2" "$11;}'
}
alias mygrep="function1"

Und hier Alias ​​zu verwenden, sind Beispiele, um jeden zu zwingen, reguläre Ausdrücke zu lernen:

. /etc/profile #to make alias usable
mygrep ${USER} ${PROCESS_PATH}
mygrep ${USER} "[f]nord"
mygrep "[f]nord"
mygrep ".*[s]shd"

P.S. Ich habe diese Befehle nur unter Ubuntu und Gentoo getestet.

0

Die Verwendung der Option -x (exakte Übereinstimmung) hat bei mir funktioniert. Ich habe es mit -f (vollständige Befehlszeile) kombiniert, damit ich meinen Prozess genau auf Folgendes abstimmen kann:

pgrep -x -f "path_i_used_when_starting/cmd params_i_used"
0
moodboom

Der Befehl pgrep gibt, wie andere angegeben haben, die PID (Prozess-ID) von Prozessen zurück, die auf dem Namen und anderen Attributen basieren. Zum Beispiel,

pgrep -d, -u <username> <string>

sie erhalten die PIDs, die durch ein Komma (,) aller Prozesse getrennt sind, deren Name mit der Ausführung durch den Benutzer <username> übereinstimmt. Sie können den Schalter -x vorher 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

ps up $(pgrep -d, -u <username> <string>)

gibt detaillierte Informationen zu allen PIDs, die mit dem Befehl pgrep übereinstimmen.

0
eToThePiIPower