Ich versuche, den Anwendungsnamen aus ps
einem 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.name
Wert „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 grep
davon ausgeht, dass alles, was mit einem beginnt, -
eine Option ist, und versucht, es als solche zu analysieren. In diesem Fall -D
wird verwendet, um Anweisungen grep
zum Umgang mit einer Gerätedatei zu geben (siehe man grep
fü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 grep
kö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 myApp
Teil 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 grep
die Ausgabe von ps
für diese Art der Sache, das ist, waspgrep
ist 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 getopt
die 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
- Ihr Befehl:
ps -af -u sas | grep java | grep -v grep
tr -s ' '
"quetscht" mehrere Räume in einen einzigen Raum in Vorbereitung aufcut
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
getopts -aql 'Dapp.name:' $(...)
analysiert die Befehlsoptionen und gibt nur den Langnamen aus, derDapp.name
mit dem Wert übereinstimmt (gekennzeichnet durch:
), das Ergebnis ist--Dapp.name 'myApp' --
cut -d"'" -f2
greift das Material in den einfachen Anführungszeichen- Ergebnis ist:
myApp