Preciso de ajuda para construir uma regex para um grep mostrar apenas o caminho para executar versões de java

Preciso de ajuda para construir uma regex para um grep mostrar apenas o caminho para executar versões de java

Preciso de ajuda para construir um grep de ps -ef para retornar apenas caminhos java.

Digamos que temos o seguinte processo em execução:

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.

O que eu tirei disso é exibir:

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

Obrigado a todos.

Responder1

Que tal grep -oP "/.*?/bin/java"isso irá desde a primeira barra que encontrar e depois tentará corresponder até a primeira ocorrência de /bin/java. O P maiúsculo obtém um bom suporte de regex do grep

ou isto e não precisa do -P com grep mesmo. grep -oP "/.*/bin/java"Começa na primeira barra e corresponde, tanto quanto possível, a qualquer caractere até e incluindo /bin/java.

E se você tivesse que resolver isso sozinho do zero, além de saber sobre regexes, você poderia testar as coisas rapidamente com echo, por exemplo, e echo user pid# 1 1 00:00 ? 00:04:00 /path/to/java/jdk_1.8/bin/java -foo=bar -foo2=bar2 ... etc. | grepdepois tentar padrões. E você pode adicionar um -i ao grep egor misturado com -o então -io para torná-lo insensível a maiúsculas e minúsculas (o que -i faz).

nota - o acima está bom, mas eu apenas observaria que se você estiver interessado em regexes ou detalhes técnicos - .*blahé um pouco interessante porque .*(é uma avaliação gananciosa) pode incluir um blá, então se você tiver blá 5 vezes, então combinaria blá 5 vezes. 4 de .*e o último de blá. Existe .*?blah(avaliação preguiçosa) que corresponderia a qualquer caractere até o primeiro blá. embora isso exija -P. Mas no seu caso, procurando por /bin/java, você não obterá /bin/java várias vezes em uma linha, então não é grande coisa/problema usar .*sem o ?.

Responder2

Parece um pouco idiota para mim imprimir psmuitas informações que você não deseja e depois ter que usar uma grepexpressão complexa para extrair o que você deseja.fazerquerer. O seguinte parece uma abordagem melhor:

ps -C java -o cmd=

Isso lhe dará a lista de argumentos do comando, mas você pode reduzi-la para o argumento 0 com o sedfiltro:

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

Se, como quase certamente é o caso, não houver espaços no javacaminho, um filtro muito mais simples poderá ser usado:

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

(Na verdade $, pode ser omitido, pois a correspondência "ganancioso" incluirá todos os caracteres até o final da linha, embora geralmente seja melhor incluí-lo para facilitar a legibilidade.)

informação relacionada