Ich versuche, den Anwendungsnamen ps
wie folgt aus dem Befehl zu extrahieren :
ps -af -u sas |grep "java"| grep -v "grep"
und es erzeugt 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?
grep
Muster mit beginnt-
, müssen Sie es nach der-e
Option einfügen. Andernfalls wird es als Option behandelt. Aber das passt nur zum Wort-Dapp.name
, nicht zum Teil danach.grep -o -- -Dapp.name
grep [j]ava
, um Befehl zu vermeidengrep -v "grep"
(auf Bash getestet)Antworten:
Mit
awk
:quelle
Sie zeigen nicht die Fehlermeldung an, die Sie erhalten, aber es ist wahrscheinlich
Dies liegt daran, dass, wie bei allen oder zumindest den meisten anderen Befehlszeilenprogrammen,
grep
davon ausgegangen wird, dass alles, was mit a beginnt,-
eine Option ist, und versucht, es als solches zu analysieren. In diesem Fall-D
wird verwendet, um Anweisungengrep
zum Umgang mit einer Gerätedatei zu erhalten (man grep
Einzelheiten siehe ). Eine Möglichkeit, dies zu--
umgehengrep
, besteht darin, zu verwenden , dass alles, was folgt, kein Optionsflag ist.Wenn Sie dies mit der PCRE-Fähigkeit von GNU kombinieren
grep
, können Sie Folgendes tun:Der reguläre Ausdruck sucht nach a
-
und verwirft es (\K
), dann die Zeichenfolge,Dapp.name=
gefolgt von so vielen Nicht-Leerzeichen wie möglich. Die Ausgabe ist:Wenn Sie möchten, dass das
myApp
Teil in einer Variablen gespeichert wird, würde ich allein danach suchen:So weisen Sie es einer Variablen zu:
Sie sollten jedoch niemals
grep
die Ausgabeps
für so etwas machen, dafürpgrep
ist es da:quelle
quelle
Jedes Mal, wenn Sie
ps … | grep …
grep verwenden und von den Ergebnissen ausschließen müssen, machen Sie es falsch.Die nullte Regel beim Parsen der Ausgabe von
ps
besteht darin, zuverlässigere Tools zu verwenden, z. B.pgrep
falls verfügbar. Wenn Sie pgrep haben, werdenpgrep -f java
alle Prozesse aufgelistet, die den Befehl ausführenjava
. Die Option-l
fügt die Befehlszeile für jeden Prozess hinzu.Um das Argument zu extrahieren
-Dapp.name
, können Sie sed verwenden. Passen Sie die gesamte Zeile an, arrangieren Sie das Füllen des interessanten Teils in einer Gruppe und drucken Sie diese Gruppe aus.Die erste Regel zum Parsen der Ausgabe von
ps
besteht darin, die Option-o
zu verwenden, um die Felder auszuwählen, die Sie benötigen. Hier interessieren Sie nur die Befehlsargumente, drucken Sie also nur diese aus.quelle
Komplizierter als die anderen Antworten, aber dies wird verwendet
getopt
, um das Parsen für Sie zu erledigen. Noch eine Alternative.ps -af -u sas | grep java | grep -v grep
tr -s ' '
"quetscht" mehrere Räume in einen einzigen Raum, um sich darauf vorzubereitencut
cut -d' ' -f8-
teilt die Zeile durch 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,Dapp.name
der mit dem Wert übereinstimmt (gekennzeichnet durch:
). Das Ergebnis ist--Dapp.name 'myApp' --
cut -d"'" -f2
packt das Zeug in den einfachen AnführungszeichenmyApp
quelle
Ich würde verwenden ,
pgrep
anstattps
wie so:Dadurch werden alle übereinstimmenden Prozesse zurückgegeben
java
und diejenigen herausgefiltert, die nur die enthaltenen anzeigen-Dapp.name=
. Das letzte Bit\w+
zeigt den Programmnamen an, vorausgesetzt, er enthält keine Leerzeichen.HINWEIS: Mit dem
-P
Schalter zumgrep
Auflisten können Sie Dinge mithilfe von PCRE - Perl-kompatiblen regulären Ausdrücken angeben . Nicht alle Versionengrep
unterstützen es, aber die meisten tun dies in moderneren Linux-Versionen.Wenn Sie die gesamte Schlüssel- / Wertausgabe wünschen, ändern Sie folgende Dinge:
quelle