J'essaie d'extraire le nom de l'application à partir d'une ps
commande comme celle-ci:
ps -af -u sas |grep "java"| grep -v "grep"
et il produit ce qui suit:
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
J'ai essayé d'utiliser egrep
mais ne semble pas fonctionner:
ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name"
Comment puis-je obtenir uniquement la -Dapp.name
valeur "myApp"?
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.grep -o -- -Dapp.name
grep [j]ava
pour éviter la commandegrep -v "grep"
(testé sur bash)Réponses:
Avec
awk
:la source
Vous n'affichez pas le message d'erreur que vous obtenez, mais il est probablement
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 indiquergrep
comment traiter un fichier de périphérique (voirman grep
pour plus de détails). Une façon de contourner ce problème consiste à utiliser--
ce qui indiquegrep
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:L'expression régulière recherche un
-
et le supprime (\K
), puis la chaîneDapp.name=
suivie du plus grand nombre de caractères non espace possible. La sortie est:Si vous voulez que la
myApp
partie soit enregistrée dans une variable, je rechercherais cela seul:Pour l'affecter à une variable:
Cependant, vous ne devriez jamais
grep
produire de sortieps
pour ce genre de chose, c'est pour çapgrep
:la source
la source
Chaque fois que vous utilisez
ps … | grep …
et devez exclure grep des résultats, vous vous trompez.La règle zéro pour analyser la sortie de
ps
est d'utiliser des outils plus fiables, commepgrep
s'ils étaient disponibles. Si vous avez pgrep,pgrep -f java
répertorie tous les processus exécutant la commandejava
. L'option-l
ajoute la ligne de commande pour chaque processus.Pour extraire l'argument de
-Dapp.name
, vous pouvez utiliser sed. Faites correspondre la ligne entière, arrangez pour remplir la partie intéressante dans un groupe et imprimez ce groupe.La première règle d'analyse de la sortie de
ps
consiste à utiliser l'option-o
pour sélectionner les champs dont vous avez besoin. Ici, vous n'êtes intéressé que par les arguments de la commande, alors n'imprimez que cela.la source
Plus compliqué que les autres réponses, mais cela permet
getopt
de gérer l'analyse pour vous. Encore une autre alternative.ps -af -u sas | grep java | grep -v grep
tr -s ' '
"comprime" plusieurs espaces en un seul espace en préparation decut
cut -d' ' -f8-
divise la ligne par des espaces et saisit tous les champs après 8 inclus, le résultat est/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:' $(...)
analyse les options de commande et affiche uniquement le nom long qui correspond àDapp.name
qui a une valeur (indiquée par le:
), le résultat est--Dapp.name 'myApp' --
cut -d"'" -f2
attrape le truc dans les guillemets simplesmyApp
la source
J'utiliserais
pgrep
au lieu deps
comme ça:Cela renverra tous les processus qui correspondent
java
, puis filtrera ceux qui ne montreront que ceux qui en contiennent-Dapp.name=
. Le dernier bit\w+
affichera le nom du programme, en supposant qu'il ne contient aucun espace.REMARQUE: le
-P
commutateur versgrep
permet de spécifier des éléments à l'aide d' expressions régulières compatibles PCRE - Perl . Toutes les versions ne legrep
prennent pas en charge, mais la plupart le font avec des versions plus modernes de Linux.Si vous voulez la sortie clé / valeur entière, changez les choses comme ceci:
la source