Estoy intentando extraer el nombre de la aplicación de ps
un 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 egrep
pero no parece funcionar:
ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name"
¿Cómo puedo obtener sólo el -Dapp.name
valor "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, grep
asume que todo lo que comienza con a -
es una opción e intenta analizarlo como tal. En este caso, -D
se utiliza para dar instrucciones grep
sobre cómo manejar un archivo de dispositivo (consulte man grep
para obtener más detalles). Una forma de evitar esto es usar --
lo que indica grep
que 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 myApp
parte 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 grep
generar la salida de ps
este tipo de cosas, eso es lo quepgrep
es 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 getopt
para 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
- tu comando:
ps -af -u sas | grep java | grep -v grep
tr -s ' '
"comprime" múltiples espacios en un solo espacio en preparación paracut
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
getopts -aql 'Dapp.name:' $(...)
analiza las opciones del comando y genera solo el nombre largo que coincide conDapp.name
quién tiene un valor (indicado por:
), el resultado es--Dapp.name 'myApp' --
cut -d"'" -f2
toma las cosas entre comillas simples- El resultado es:
myApp