Wenn ich die Liste der Prozesse überprüfe und diejenigen heraushole, die für mich interessant sind, wird das grep
selbst auch in die Ergebnisse einbezogen. Zum Auflisten von Terminals:
$ 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
Normalerweise benutze ich ps aux | grep something | grep -v grep
, um den letzten Eintrag loszuwerden ... aber es ist nicht elegant :)
Haben Sie einen eleganteren Hack, um dieses Problem zu lösen (abgesehen davon, dass Sie den gesamten Befehl in ein separates Skript packen, was auch nicht schlecht ist)?
ps ux | awk '/name/ && !/awk/ {print $2}'
grep -v grep
Teil?grep -v grep
schließtgrep
von grep-Ergebnissen aus. Wenn grep in Kombination mit ps verwendet wird, wird auch der grep-Prozess (mit grep-Argumenten) angezeigt, wodurch Ihre Ergebnisse unübersichtlich werden. grep -v grep ist ein üblicher Weg, um dies zu vermeidenAntworten:
Die übliche Technik ist folgende:
Dies wird mit Zeilen übereinstimmen, die enthalten
terminal
, wasegrep '[t]erminal'
nicht! Es funktioniert auch mit vielen Unix-Varianten.quelle
ps aux | grep '[r]oot'
. Weiß jemand warum?| grep '[t]erminal'
eine Zeile aus, die das Wort 'terminal' enthält, ohne das Wort 'terminal' in die Prozessliste aufzunehmen. Was versuchst du damit zu erreichen| grep '[r]oot'
und wie funktioniert es nicht? Es gibt wahrscheinlich eine bessere Lösung.grep '[t]erminal'
wird mit Zeilen übereinstimmen, die enthaltenterminal
. Die Ausgabe vonps aux
hat eine Zeile mitgrep '[t]erminal'
(mit eckigen Klammern), die die Zeichenfolge nicht enthältterminal
(ohne dieselbe).Verwenden Sie pgrep . Es ist zuverlässiger.
quelle
pgrep
wird nicht funktionieren, wenn ich zum Beispiel nachps aux | grep 'ssh options'
pgrep -f
?pgrep
das Muster nur mit dem Prozessnamen abgeglichen . Verwenden Sie das-f
Flag , um mit dem gesamten Befehl übereinzustimmen.pgrep
Gibt nur Prozess-IDs zurück.pgrep -fl
(konnten aber keine vollständige cmdline sehen, ohne-f
mit der vollständigen cmdline übereinzustimmen, Details: serverfault.com/a/619788/44183 ). Aber ja, wenn Sie neben pid, cmdline noch weitere Informationen benötigen, benötigen Sie dieseps
. Kann sie kombinieren:ps -p $(pgrep -f foo)
Diese Antwort baut auf einer vorherigen
pgrep
Antwort auf . Es baut auch auf einer anderen Antwort auf, die die Verwendung vonps
mit kombiniertpgrep
. Hier sind einige relevante Trainingsbeispiele:Das Obige kann als Funktion verwendet werden :
Vergleichen Sie mit der Verwendung
ps
mitgrep
. Die nützliche Kopfzeile wird nicht gedruckt:quelle
-d
Option zum Angeben eines Trennzeichens. zBps -fp$(pgrep -d , getty)
ps uxp `pgrep <process>`
Beachten Sie, dassp
dies der letzte Parameter sein muss (dhpux
nicht funktioniert)Sie können im Befehl ps filtern, z
(oder durchsuchen / proc mit find etc.)
quelle
ps -C <command>
entspricht dem genauen Befehl. Wenn sie mit den verwendetena
oderx
Optionen wird es alle Prozesse berichten, daa
undx
Liste Prozesse zusätzlich zu dem Satz von durch andere Mittel angepasst Prozesse.logind
fürsystemd-logind
oder zum Abgleichen von Argumenten.Noch eine Alternative :
Hier die Optionen:
quelle
-C
Option wurde bereits in der Antwort von @Andreas Frishe vorgeschlagen, die über anderthalb Jahre zuvor veröffentlicht wurde…Die Verwendung von Klammern zum Umgeben eines Zeichens im Suchmuster schließt den
grep
Vorgang aus, da er nicht den passenden regulären Ausdruck enthält.quelle
Haftungsausschluss: Ich bin der Autor dieses Tools, aber ...
Ich würde px verwenden :
Abgesehen davon, dass Prozesse mit einer sinnvollen Befehlszeilenschnittstelle gefunden werden, werden auch viele andere nützliche Dinge ausgeführt, weitere Details auf der Projektseite .
Funktioniert unter Linux und OS X, einfach zu installieren:
quelle
Abhängig vom endgültigen Anwendungsfall möchten Sie häufig stattdessen Awk bevorzugen.
Dies gilt insbesondere dann, wenn Sie so etwas haben
wo offensichtlich der reguläre Ausdruck trivial in das Awk-Skript einbezogen werden kann:
Aber wirklich, erfinden Sie das nicht selbst neu.
pgrep
und Freunde sind schon lange da und behandeln diesen gesamten Problembereich viel besser als die meisten Ad-hoc-Neuimplementierungen.quelle
Eine andere Möglichkeit besteht darin, Ihre
.bash_profile
(oder eine andere Datei, in der Sie Bash-Aliase behalten) zu bearbeiten , um eine Funktion zu erstellen, die 'grep' aus den Ergebnissen herausgreift.Das
grep -v grep
muss zuerst sein, sonst--color=auto
funktioniert es aus irgendeinem Grund nicht.Dies funktioniert, wenn Sie bash verwenden. Wenn Sie eine andere Shell YMMV verwenden.
quelle
function grep { command grep -v grep | command grep --color=auto "$@"; }
(beachten Sie auch die Korrektur des Arguments und das Zitieren). Dies wird jedoch dadurch unterbrochen, dass ein Nichtaufrufps
vongrep
nicht mehr funktioniert (die Argumente werden falsch übergeben). Eine viel nützlichere Funktion wäre jedenfalls eine, die den regulären Ausdruck so ändert, dass er nicht mit sich selbst übereinstimmt, anstatt separatgrep
aus dengrep
Ergebnissen herauszufiltern . Und natürlich ist es nicht sehr produktiv, neue Lösungen für ein Problem zu erfinden, das vor Jahrzehnten angemessen gelöst wurde.