Bash: Grep-regulärer Ausdruck funktioniert nicht

Bash: Grep-regulärer Ausdruck funktioniert nicht

Bei Verwendung grepwie folgt:

ps aux | grep 'processname' | awk '{print $2}'

Die Anzahl PIDsder Prozesse mit processnamewird zurückgegeben. Bei Verwendung davon:

ps aux | grep '^processname' | awk '{print $2}'

Ich versuche, Prozesse abzurufen, deren Befehlszeile mit beginnt processname, aber es funktioniert nicht.

Beispiel für laufende Prozesse:

processname
other_processname

Ich möchte PIDdie erste Option erhalten, da processnamedies der Anfang des Befehls ist.

Ich habe auch versucht, die -E, -e, -wFlags zu verwenden, und sie liefern alle das gleiche Ergebnis. Was ist falsch?

Antwort1

^markiert den Anfang einer Zeile, nicht eines Feldes.

ps aux | grep ' processname'

wird näher kommen, aber es könnte trotzdem noch einige falsche Ergebnisse geben.

Da die Breite der anderen Spalten fest ist, können Sie auch

grep '^.\{65\}processname'

Hier ^.\{65\}sind es genau 65 Zeichen ab Zeilenanfang. Die genaue Zahl kann auf Ihrem System abweichen.

Da Sie bereits awk verwenden, wäre dies wahrscheinlich eine bessere Option:

ps aux | awk '{ if ($11 == "processname") print $2 }'

Sie können die Ausgabe von ps auch neu formatieren, um das Greppen zu erleichtern:

ps ax -o pid,args | grep '^[^ ]\+ processname'

Der Schalter -o pid,argsbewirkt, dass ps nur die PID und den Befehl mit Argumenten anzeigt. Der Ausdruck ^[^ ]\+passt auf alle Zeichen vom Zeilenanfang bis zum ersten Leerzeichen.

verwandte Informationen