![Preciso de ajuda para construir uma regex para um grep mostrar apenas o caminho para executar versões de java](https://rvso.com/image/1493939/Preciso%20de%20ajuda%20para%20construir%20uma%20regex%20para%20um%20grep%20mostrar%20apenas%20o%20caminho%20para%20executar%20vers%C3%B5es%20de%20java.png)
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. | grep
depois 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 ps
muitas informações que você não deseja e depois ter que usar uma grep
expressã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 sed
filtro:
ps -C java -o cmd= | sed 's%\(/java\) .*$%\1%'
Se, como quase certamente é o caso, não houver espaços no java
caminho, 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.)