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. | grep
luego 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, .*blah
es 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 ps
mucha información que no quieres y luego tener que usar una grep
expresió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 sed
filtro:
ps -C java -o cmd= | sed 's%\(/java\) .*$%\1%'
Si, como es casi seguro que es el caso, no hay espacios en la java
ruta, 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).