Necesito ayuda para crear una expresión regular para un grep que muestre solo la ruta de acceso a las versiones ejecutables de Java

-3

Necesito ayuda para construir un grep desde ps -ef para devolver solo las 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 era de esto es mostrar:

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

Gracias a todos.

Barry
fuente
Aparte de la cita, ¿qué hay de malo en tu comando?
AFH
Hola AFH veo la cita extra gracias. El problema no es el bucle en sí, tal vez eso fue demasiada información. Todo lo que quiero mostrar es la versión en ejecución de Java. Estoy buscando algún tipo de grep: grep -o '/ * java' que solo mostrará el comando java sin parámetros u otros atributos de ps
Barry
básicamente quieres un buen regex
barlop
Sí, eso es todo lo que estoy buscando. Escogí un título pobre por la pregunta, perdón por eso. He arreglado el título y simplificado mi problema,
Barry
qué tal si grep -oP "/.*?/bin/java" Esto irá desde la primera barra hacia adelante que encuentre, luego intente hacer coincidir hasta la primera aparición de / bin / java. La capital P recibe un buen apoyo de expresiones regulares de Grep
barlop

Respuestas:

-1

Qué tal si grep -oP "/.*?/bin/java" Esto irá desde la primera barra hacia adelante que encuentre, luego intente hacer coincidir hasta la primera aparición de / bin / java. La capital P obtiene un buen soporte de expresiones regulares de grep

o esto y no necesita el -P con grep incluso. grep -oP "/.*/bin/java" Comienza desde la primera barra diagonal hacia adelante y luego compara lo más posible cualquier carácter hasta e incluyendo / bin / java.

Y si tuvo que resolverlo usted mismo desde cero, además de saber sobre expresiones regulares, puede probar las cosas rápidamente con eco, por ejemplo. echo user pid# 1 1 00:00 ? 00:04:00 /path/to/java/jdk_1.8/bin/java -foo=bar -foo2=bar2 ... etc. | grep a continuación, intente patrones. Y puede agregar un -i al grep, por ejemplo, o mezclarlo con -o para que -io haga que no se distinga entre mayúsculas y minúsculas (lo que hace -i).

nota: lo anterior está bien, pero me gustaría señalar que si está interesado en expresiones regulares o tecnicismos .*blah es un poco interesante porque el .* (es una evaluación codiciosa) puede incluir un bla, así que si tiene bla 5 veces, entonces coincidirá con bla 5 veces. 4 de .* y el último de bla. Ahi esta .*?blah (evaluación perezosa) que coincidiría con cualquier personaje hasta el primer bla. aunque eso requiere -P. Pero en su caso buscando / bin / java, no va a obtener / bin / java varias veces en una línea, por lo que no es un gran problema / problema, usar el .* sin el ?.

barlop
fuente
0

Me parece un poco tonto conseguirlo ps para imprimir una gran cantidad de información que no desea, entonces tiene que utilizar un complejo grep Expresión para extraer lo que tú. hacer querer. Lo siguiente parece un mejor enfoque:

ps -C java -o cmd=

Esto le dará la lista de argumentos del comando, pero puede eliminarla al argumento 0 con la sed filtrar:

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

Si, como es casi seguro, no hay espacios en el java ruta, un filtro mucho más simple se puede utilizar:

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

(De hecho el $ se puede omitir, ya que la coincidencia "codiciosa" incluirá a todos los personajes hasta el final de la línea, aunque generalmente también es así para incluirla por legibilidad.

AFH
fuente