Estou tentando extrair o nome do aplicativo do ps
comando como este:
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
Eu 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"?
grep
padrão começar-
, você precisará colocá-lo após a-e
opção. Caso contrário, será tratado como uma opção. Mas isso apenas corresponderá à palavra-Dapp.name
, não à parte posterior.grep -o -- -Dapp.name
grep [j]ava
para evitar o comandogrep -v "grep"
(testado no bash) #Respostas:
Com
awk
:fonte
Você não está mostrando a mensagem de erro que está recebendo, mas provavelmente é
Isso ocorre 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. Nesse caso,-D
é usado para instruirgrep
sobre como lidar com um arquivo de dispositivo (consulteman grep
para obter detalhes). Uma maneira de contornar isso é usar o--
que informagrep
que qualquer coisa a seguir não é um sinalizador de opção.Combinando isso com a capacidade PCRE do GNU
grep
, você pode:A expressão regular procura por
-
e a descarta (\K
), depois a sequênciaDapp.name=
seguida pelo maior número possível de caracteres não espaciais. A saída é:Se você deseja que a
myApp
peça seja salva em uma variável, eu procuraria apenas isso:Para atribuí-lo a uma variável:
No entanto, você nunca deve
grep
produzirps
esse tipo de coisa,pgrep
é para isso:fonte
fonte
Sempre que você usar
ps … | grep …
e precisar excluir o grep dos resultados, estará fazendo errado.A regra zero de analisar a saída de
ps
é usar ferramentas mais confiáveis, comopgrep
se disponíveis. Se você possui o pgrep,pgrep -f java
lista todos os processos que executam o comandojava
. A opção-l
adiciona a linha de comando para cada processo.Para extrair o argumento
-Dapp.name
, você pode usar sed. Combine a linha inteira, organize a parte interessante de um grupo e imprima esse grupo.A primeira regra de analisar a saída de
ps
é usar a opção-o
para selecionar os campos que você precisa. Aqui, você está interessado apenas nos argumentos do comando, portanto, imprima apenas isso.fonte
Mais complicado do que as outras respostas, mas isso serve
getopt
para lidar com a análise para você. Mais uma alternativa.ps -af -u sas | grep java | grep -v grep
tr -s ' '
"espreme" vários espaços em um único espaço em preparação paracut
cut -d' ' -f8-
divide a linha por espaços e agarra 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 possui um valor (indicado por:
), o resultado é--Dapp.name 'myApp' --
cut -d"'" -f2
pega o material entre aspas simplesmyApp
fonte
Eu usaria em
pgrep
vez deps
assim:Isso retornará todos os processos correspondentes
java
e depois os filtrará, mostrando apenas os que contêm-Dapp.name=
. O último bit\w+
mostrará o nome do programa, assumindo que ele não contém espaços.NOTA: A
-P
opção paragrep
solicita a especificação de itens usando Expressões regulares compatíveis com PCRE - Perl . Nem todas as versões degrep
suporte, mas a maioria inclui as versões mais modernas do Linux.Se você deseja a saída completa da chave / valor, mude da seguinte maneira:
fonte