No está mostrando el mensaje de error que está 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 otros programas de línea de comandos, grep
supone que todo lo que comienza con una -
es una opción e intenta analizarlo como tal. En este caso, -D
se utiliza para instruir grep
sobre cómo tratar con un archivo de dispositivo (ver man grep
para 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
, puede hacer:
ps -af -u sas | grep -v grep | grep -Po -- '*-\KDapp.name=[^\s]+'
La expresión regular busca -
ay lo descarta ( \K
), luego la cadena Dapp.name=
seguida de tantos caracteres que no sean espacios como sea posible. El resultado es:
Dapp.name=myApp
Si desea myApp
guardar la parte en una variable, buscaría eso 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 debe ser grep
la salida de ps
este tipo de cosas, para eso pgrep
está:
app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"
grep
patrón comienza con-
, debe colocarlo después de la-e
opción. De lo contrario, se tratará como una opción. Pero eso solo coincidirá con la palabra-Dapp.name
, no con la parte posterior.