Cómo extraer un par clave-valor del comando ps

Cómo extraer un par clave-valor del comando ps

Estoy intentando extraer el nombre de la aplicación de psun comando como este:

ps -af -u sas |grep "java"| grep -v "grep"

y produce lo siguiente:

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

Intenté usar egreppero no parece funcionar:

ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name"

¿Cómo puedo obtener sólo el -Dapp.namevalor "myApp"?

Respuesta1

No estás mostrando el mensaje de error que estás recibiendo pero probablemente sea

grep: método de dispositivos desconocidos

Esto se debe a que, como todos o al menos la mayoría de los demás programas de línea de comandos, grepasume que todo lo que comienza con a -es una opción e intenta analizarlo como tal. En este caso, -Dse utiliza para dar instrucciones grepsobre cómo manejar un archivo de dispositivo (consulte man greppara obtener más detalles). Una forma de evitar esto es usar --lo que indica grepque todo lo que sigue no es un indicador de opción.

Combinando eso con la capacidad PCRE de GNU grep, puedes hacer:

ps -af -u sas | grep -v grep | grep -Po -- '*-\KDapp.name=[^\s]+'

La expresión regular busca a -y lo descarta ( \K), luego la cadena Dapp.name=seguida de tantos caracteres que no sean espacios como sea posible. La salida es:

Dapp.name=myApp

Si desea que la myAppparte se guarde en una variable, la buscaría solo:

ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+'

Para asignarlo a una variable:

$ app="$(ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+')"
$ echo $app
myApp

Sin embargo, nunca deberías grepgenerar la salida de pseste tipo de cosas, eso es lo quepgrepes para:

app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"

Respuesta2

Con awk:

ps -af -u sas | awk 'BEGIN {RS=" "}; /-Dapp.name/'

Respuesta3

ps -af -u sas | sed -n '/[j]ava/s/.*-Dapp\.name=\([^ ]*\).*/\1/p'

Respuesta4

Más complicado que las otras respuestas, pero esto se utiliza getoptpara manejar el análisis por usted. Otra alternativa más.

getopt -aql 'Dapp.name:' $(\
    ps -af -u sas | grep java | grep -v grep | tr -s ' ' | cut -d' ' -f8-\
) | cut -d"'" -f2
  1. tu comando:ps -af -u sas | grep java | grep -v grep
  2. tr -s ' '"comprime" múltiples espacios en un solo espacio en preparación paracut
  3. cut -d' ' -f8-divide la línea por espacios y toma todos los campos después de 8 inclusive, el resultado es/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:' $(...)analiza las opciones del comando y genera solo el nombre largo que coincide con Dapp.namequién tiene un valor (indicado por :), el resultado es--Dapp.name 'myApp' --
  5. cut -d"'" -f2toma las cosas entre comillas simples
  6. El resultado es:myApp

información relacionada