Estoy tratando de extraer el nombre de la aplicación de un ps
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 estar funcionando:
ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name"
¿Cómo puedo obtener solo el -Dapp.name
valor "myApp"?
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.grep -o -- -Dapp.name
grep [j]ava
para evitar el comandogrep -v "grep"
(probado en bash)Respuestas:
Con
awk
:fuente
No está mostrando el mensaje de error que está recibiendo, pero probablemente sea
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 instruirgrep
sobre cómo tratar con un archivo de dispositivo (verman grep
para más detalles). Una forma de evitar esto es usar lo--
que indicagrep
que todo lo que sigue no es un indicador de opción.Combinando eso con la capacidad PCRE de GNU
grep
, puede hacer:La expresión regular busca
-
ay lo descarta (\K
), luego la cadenaDapp.name=
seguida de tantos caracteres que no sean espacios como sea posible. El resultado es:Si desea
myApp
guardar la parte en una variable, buscaría eso solo:Para asignarlo a una variable:
Sin embargo, nunca debe ser
grep
la salida deps
este tipo de cosas, para esopgrep
está:fuente
fuente
Cada vez que usa
ps … | grep …
y necesita excluir grep de los resultados, lo está haciendo mal.La regla cero de analizar la salida de
ps
es utilizar herramientas más confiables, comopgrep
si están disponibles. Si tiene pgrep,pgrep -f java
enumera todos los procesos que ejecutan el comandojava
. La opción-l
agrega la línea de comando para cada proceso.Para extraer el argumento
-Dapp.name
, puede usar sed. Haga coincidir toda la línea, organice la parte interesante en un grupo e imprima ese grupo.La primera regla para analizar la salida de
ps
es utilizar la opción-o
para seleccionar los campos que necesita. Aquí, solo le interesan los argumentos del comando, así que imprima solo eso.fuente
Más complicado que las otras respuestas, pero esto se usa
getopt
para manejar el análisis por usted. Otra alternativa más.ps -af -u sas | grep java | grep -v grep
tr -s ' '
"exprime" 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 de 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
agarra las cosas entre comillas simplesmyApp
fuente
Yo usaría en
pgrep
lugar deps
así:Esto devolverá todos los procesos que coinciden
java
y luego los filtrará mostrando solo los que contienen-Dapp.name=
. El último bit\w+
mostrará el nombre del programa, suponiendo que no contiene espacios.NOTA: El
-P
cambio agrep
alista la capacidad de especificar cosas usando PCRE - Expresiones regulares compatibles con Perl . No todas las versiones logrep
admiten, pero la mayoría lo hacen con versiones más modernas de Linux.Si desea la salida completa de la clave / valor, cambie las cosas así:
fuente