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.


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 ?.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.