Como extrair um par de valores-chave do comando ps

Como extrair um par de valores-chave do comando ps

Estou tentando extrair o nome do aplicativo do pscomando 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.namevalor “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, grepassume que qualquer coisa que comece com a -é uma opção e tenta analisá-la como tal. Neste caso, -Dé usado para instruir grepcomo lidar com um arquivo de dispositivo (veja man grepdetalhes). Uma maneira de contornar isso é usar --which informa grepque 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 myAppparte 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 grepproduzir psesse 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 getoptpara 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
  1. seu comando:ps -af -u sas | grep java | grep -v grep
  2. tr -s ' '"comprime" vários espaços em um único espaço em preparação paracut
  3. 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
  4. getopts -aql 'Dapp.name:' $(...)analisa as opções de comando e gera apenas o nome longo que corresponde a Dapp.namequem tem um valor (indicado por :), o resultado é--Dapp.name 'myApp' --
  5. cut -d"'" -f2pega as coisas entre aspas simples
  6. O resultado é:myApp

informação relacionada