Eigentlich awk ist genau das Tool, das Sie sich ansehen sollten:
ps axu | grep '[j]boss' | awk '{print $5}'
oder Sie können die grep fallen lassen insgesamt seit awk kennt sich mit regulären Ausdrücken aus:
ps axu | awk '/[j]boss/ {print $5}'
Aber wenn Sie aus irgendeinem bizarren Grund wirklich nicht können Verwenden Sie awk , gibt es andere einfachere Dinge, die Sie tun können, wie z. B. zunächst alle Leerzeichen auf ein einziges Leerzeichen reduzieren:
ps axu | grep '[j]boss' | sed 's/\s\s*/ /g' | cut -d' ' -f5
Diese grep Trick ist übrigens ein netter Weg, um nur den jboss zu bekommen Prozesse und nicht die grep jboss eins (dito für awk Variante).
Die grep Der Prozess hat einen wörtlichen grep [j]boss in seinem Verarbeitungsbefehl wird also nicht von grep abgefangen selbst, die nach der Zeichenklasse [j] sucht gefolgt von boss .
Dies ist ein raffinierter Weg, um | grep xyz | grep -v grep zu vermeiden Paradigma, das einige Leute verwenden.
awk Version ist wahrscheinlich der beste Weg, aber Sie können auch cut verwenden wenn Sie zuerst die Wiederholungen mit tr drücken :
ps axu | grep jbos[s] | tr -s ' ' | cut -d' ' -f5
# ^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^
# | | |
# | | get 5th field
# | |
# | squeeze spaces
# |
# avoid grep itself to appear in the list
Ich verwende dafür gerne den Befehl tr -s
ps aux | tr -s [:blank:] | cut -d' ' -f3
Dadurch werden alle Leerzeichen auf 1 Leerzeichen komprimiert. Auf diese Weise wird die Anweisung an cut, ein Leerzeichen als Trennzeichen zu verwenden, wie erwartet berücksichtigt.