Vous n'affichez pas le message d'erreur que vous obtenez, mais il est probablement
grep: méthode des périphériques inconnus
C'est parce que, comme tous ou au moins la plupart des autres programmes de ligne de commande, grep
suppose que tout ce qui commence par un -
est une option et essaie de l'analyser en tant que tel. Dans ce cas, -D
est utilisé pour indiquer grep
comment traiter un fichier de périphérique (voir man grep
pour plus de détails). Une façon de contourner ce problème consiste à utiliser --
ce qui indique grep
que tout ce qui suit n'est pas un indicateur d'option.
En combinant cela avec la capacité PCRE de GNU grep
, vous pouvez faire:
ps -af -u sas | grep -v grep | grep -Po -- '*-\KDapp.name=[^\s]+'
L'expression régulière recherche un -
et le supprime ( \K
), puis la chaîne Dapp.name=
suivie du plus grand nombre de caractères non espace possible. La sortie est:
Dapp.name=myApp
Si vous voulez que la myApp
partie soit enregistrée dans une variable, je rechercherais cela seul:
ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+'
Pour l'affecter à une variable:
$ app="$(ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+')"
$ echo $app
myApp
Cependant, vous ne devriez jamais grep
produire de sortie ps
pour ce genre de chose, c'est pour ça pgrep
:
app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"
grep
motif commence par-
, vous devez le mettre après l'-e
option. Sinon, il sera traité comme une option. Mais cela correspondra simplement au mot-Dapp.name
, pas à la partie qui le suit.