Estou tentando extrair o nome do aplicativo do ps
comando assim:
ps -af -u sas |grep "java"| grep -v "grep"
e produz o seguinte:
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
Tentei usar egrep
, mas não parece estar funcionando:
ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name"
Como posso obter apenas o -Dapp.name
valor “myApp”?
Responder1
Você não está mostrando a mensagem de erro que está recebendo, mas provavelmente é
grep: método de dispositivos desconhecidos
Isso porque, como todos ou pelo menos a maioria dos outros programas de linha de comando, grep
assume que qualquer coisa que comece com a -
é uma opção e tenta analisá-la como tal. Neste caso, -D
é usado para instruir grep
como lidar com um arquivo de dispositivo (veja man grep
detalhes). Uma maneira de contornar isso é usar --
which informa grep
que qualquer coisa a seguir não é um sinalizador de opção.
Combinando isso com a capacidade PCRE do GNU grep
, você pode fazer:
ps -af -u sas | grep -v grep | grep -Po -- '*-\KDapp.name=[^\s]+'
A expressão regular procura a -
e descarta-o ( \K
), depois a string Dapp.name=
seguida por tantos caracteres não espaciais quanto possível. A saída é:
Dapp.name=myApp
Se você quiser que a myApp
parte seja salva em uma variável, eu procuraria apenas por ela:
ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+'
Para atribuí-lo a uma variável:
$ app="$(ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+')"
$ echo $app
myApp
No entanto, você nunca deve grep
produzir ps
esse tipo de coisa, é isso quepgrep
é para:
app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"
Responder2
Com awk
:
ps -af -u sas | awk 'BEGIN {RS=" "}; /-Dapp.name/'
Responder3
ps -af -u sas | sed -n '/[j]ava/s/.*-Dapp\.name=\([^ ]*\).*/\1/p'
Responder4
Mais complicado que as outras respostas, mas isso é usado getopt
para lidar com a análise para você. Mais uma alternativa.
getopt -aql 'Dapp.name:' $(\
ps -af -u sas | grep java | grep -v grep | tr -s ' ' | cut -d' ' -f8-\
) | cut -d"'" -f2
- seu comando:
ps -af -u sas | grep java | grep -v grep
tr -s ' '
"comprime" vários espaços em um único espaço em preparação paracut
cut -d' ' -f8-
divide a linha por espaços e pega todos os campos após 8 inclusive, o resultado é/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:' $(...)
analisa as opções de comando e gera apenas o nome longo que corresponde aDapp.name
quem tem um valor (indicado por:
), o resultado é--Dapp.name 'myApp' --
cut -d"'" -f2
pega as coisas entre aspas simples- O resultado é:
myApp