Estoy tratando de extraer el nombre de la aplicación de un pscomando 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 egreppero no parece estar funcionando:
ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name"
¿Cómo puedo obtener solo el -Dapp.namevalor "myApp"?

greppatrón comienza con-, debe colocarlo después de la-eopció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.namegrep [j]avapara 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,
grepsupone que todo lo que comienza con una-es una opción e intenta analizarlo como tal. En este caso,-Dse utiliza para instruirgrepsobre cómo tratar con un archivo de dispositivo (verman greppara más detalles). Una forma de evitar esto es usar lo--que indicagrepque 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
myAppguardar la parte en una variable, buscaría eso solo:Para asignarlo a una variable:
Sin embargo, nunca debe ser
grepla salida depseste tipo de cosas, para esopgrepestá: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
pses utilizar herramientas más confiables, comopgrepsi están disponibles. Si tiene pgrep,pgrep -f javaenumera todos los procesos que ejecutan el comandojava. La opción-lagrega 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
pses utilizar la opción-opara 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
getoptpara manejar el análisis por usted. Otra alternativa más.ps -af -u sas | grep java | grep -v greptr -s ' '"exprime" múltiples espacios en un solo espacio en preparación paracutcut -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/logsgetopts -aql 'Dapp.name:' $(...)analiza las opciones de comando y genera solo el nombre largo que coincide conDapp.namequién tiene un valor (indicado por:), el resultado es--Dapp.name 'myApp' --cut -d"'" -f2agarra las cosas entre comillas simplesmyAppfuente
Yo usaría en
pgreplugar depsasí:Esto devolverá todos los procesos que coinciden
javay 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
-Pcambio agrepalista la capacidad de especificar cosas usando PCRE - Expresiones regulares compatibles con Perl . No todas las versiones logrepadmiten, 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