Necesito ayuda para crear una expresión regular para que grep muestre solo la ruta para ejecutar versiones de Java.

Necesito ayuda para crear una expresión regular para que grep muestre solo la ruta para ejecutar versiones de Java.

Necesito ayuda para crear un grep desde ps -ef para devolver solo rutas de Java.

Digamos que tenemos el siguiente proceso en ejecución:

bash> ps -ef | grep java
user  pid#      1  1 00:00 ?        00:04:00 /path/to/java/jdk_1.8/bin/java -foo=bar -foo2=bar2 ... etc.

Lo que obtuve de esto es mostrar:

bash> ps -ef | grep 'some regex or pattern here'
/path/to/java/jdk_1.8/bin/java

Gracias a todos.

Respuesta1

¿Qué tal grep -oP "/.*?/bin/java"si eso irá desde la primera barra diagonal que encuentre y luego intentará hacer coincidir hasta la primera aparición de /bin/java? La P mayúscula obtiene un buen soporte de expresiones regulares de grep

o esto y ni siquiera necesita -P con grep. grep -oP "/.*/bin/java"Comienza desde la primera barra diagonal y luego coincide tanto como sea posible con cualquier carácter hasta /bin/java inclusive.

Y si tuviera que resolverlo usted mismo desde cero, además de conocer las expresiones regulares, puede probar cosas rápidamente con eco, por ejemplo, y echo user pid# 1 1 00:00 ? 00:04:00 /path/to/java/jdk_1.8/bin/java -foo=bar -foo2=bar2 ... etc. | grepluego probar patrones. Y puede agregar -i al grep egor mezclado con -o entonces -io para que no distinga entre mayúsculas y minúsculas (lo que hace -i).

nota: lo anterior está bien, pero solo quisiera señalar que si está interesado en expresiones regulares o tecnicismos, .*blahes un poco interesante porque .*(es una evaluación codiciosa) puede incluir un bla, por lo que si tiene bla 5 veces, entonces coincidiría. bla 5 veces. 4 de .*y el último de bla. Hay .*?blah(evaluación diferida) que coincidiría con cualquier carácter hasta el primer bla. aunque eso requiere -P. Pero en su caso, al buscar /bin/java, no obtendrá /bin/java varias veces en una línea, por lo que no es gran cosa/problema usar sin .*?.

Respuesta2

Me parece un poco tonto imprimir psmucha información que no quieres y luego tener que usar una grepexpresión compleja para extraer lo que quieres.hacerdesear. Lo siguiente parece un mejor enfoque:

ps -C java -o cmd=

Esto le dará la lista de argumentos del comando, pero puede podarla al argumento 0 con el sedfiltro:

ps -C java -o cmd= | sed 's%\(/java\) .*$%\1%'

Si, como es casi seguro que es el caso, no hay espacios en la javaruta, se puede utilizar un filtro mucho más sencillo:

ps -C java -o cmd= | sed 's/ .*$//'

(De hecho, $se puede omitir, ya que la coincidencia "codiciosa" incluirá todos los caracteres hasta el final de la línea, aunque generalmente es mejor incluirlos para mayor legibilidad).

información relacionada