So extrahieren Sie ein Schlüssel-Wert-Paar aus dem PS-Befehl

So extrahieren Sie ein Schlüssel-Wert-Paar aus dem PS-Befehl

Ich versuche, den Anwendungsnamen aus pseinem Befehl wie diesem zu extrahieren:

ps -af -u sas |grep "java"| grep -v "grep"

und es ergibt sich folgendes:

sas 24431     1  0 Oct10 ?        00:51:08 /usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs

Ich habe es versucht egrep, aber es scheint nicht zu funktionieren:

ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name"

Wie kann ich nur den -Dapp.nameWert „myApp“ erhalten?

Antwort1

Sie zeigen nicht die Fehlermeldung, die Sie erhalten, aber es ist wahrscheinlich

grep: Methode „unbekannte Geräte“

Das liegt daran, dass es wie alle oder zumindest die meisten anderen Befehlszeilenprogramme grepdavon ausgeht, dass alles, was mit einem beginnt, -eine Option ist, und versucht, es als solche zu analysieren. In diesem Fall -Dwird verwendet, um Anweisungen grepzum Umgang mit einer Gerätedatei zu geben (siehe man grepfür Details). Eine Möglichkeit, dies zu umgehen, besteht darin, zu verwenden , --was angibt grep, dass alles Folgende kein Optionsflag ist.

In Kombination mit der PCRE-Fähigkeit von GNU grepkönnen Sie Folgendes tun:

ps -af -u sas | grep -v grep | grep -Po -- '*-\KDapp.name=[^\s]+'

Der reguläre Ausdruck sucht nach einem -und verwirft es ( \K), dann nach der Zeichenfolge, Dapp.name=gefolgt von so vielen Zeichen wie möglich, die keine Leerzeichen sind. Die Ausgabe ist:

Dapp.name=myApp

Wenn Sie den myAppTeil in einer Variablen speichern möchten, würde ich nur danach suchen:

ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+'

So weisen Sie es einer Variablen zu:

$ app="$(ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+')"
$ echo $app
myApp

Allerdings sollten Sie nie grepdie Ausgabe von psfür diese Art der Sache, das ist, waspgrepist für:

app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"

Antwort2

Mit awk:

ps -af -u sas | awk 'BEGIN {RS=" "}; /-Dapp.name/'

Antwort3

ps -af -u sas | sed -n '/[j]ava/s/.*-Dapp\.name=\([^ ]*\).*/\1/p'

Antwort4

Komplizierter als die anderen Antworten, aber dies übernimmt getoptdie Analyse für Sie. Noch eine Alternative.

getopt -aql 'Dapp.name:' $(\
    ps -af -u sas | grep java | grep -v grep | tr -s ' ' | cut -d' ' -f8-\
) | cut -d"'" -f2
  1. Ihr Befehl:ps -af -u sas | grep java | grep -v grep
  2. tr -s ' '"quetscht" mehrere Räume in einen einzigen Raum in Vorbereitung aufcut
  3. cut -d' ' -f8-teilt die Zeile nach Leerzeichen und erfasst alle Felder nach 8 einschließlich, Ergebnis ist/usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs
  4. getopts -aql 'Dapp.name:' $(...)analysiert die Befehlsoptionen und gibt nur den Langnamen aus, der Dapp.namemit dem Wert übereinstimmt (gekennzeichnet durch :), das Ergebnis ist--Dapp.name 'myApp' --
  5. cut -d"'" -f2greift das Material in den einfachen Anführungszeichen
  6. Ergebnis ist:myApp

verwandte Informationen