Мне нужна помощь в создании регулярного выражения для grep, чтобы показать только путь к работающим версиям Java

Мне нужна помощь в построении grep из ps -ef для возврата только путей Java.

Скажем, у нас есть следующий рабочий процесс:

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.

Что я из этого должен показать:

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

Спасибо всем.

2 ответа

Решение

Как насчет grep -oP "/.*?/bin/java" Это будет происходить с первого найденного прямого слеша, а затем попытаться найти совпадение до первого появления /bin/java. Заглавная буква P получает хорошую поддержку регулярных выражений от grep

или это и не нужно -P с grep даже. grep -oP "/.*/bin/java" Начинается с первой косой черты, затем максимально соответствует любому символу вплоть до / включая /bin/java.

И если вам приходилось самим решать это с нуля, то, помимо знания регулярных выражений, вы можете быстро проверить вещи с помощью echo, например: echo user pid# 1 1 00:00 ? 00:04:00 /path/to/java/jdk_1.8/bin/java -foo=bar -foo2=bar2 ... etc. | grep тогда попробуйте шаблоны. И вы можете добавить -i к grep egor, смешанному с -o so -io, чтобы сделать его нечувствительным к регистру (что делает -i).

Обратите внимание, что все хорошо, но я хотел бы отметить, что если вы заинтересованы в регулярных выражениях или технических особенностях, .*blah это немного интересно, потому что .*(жадная оценка) может включать в себя бла, так что если у вас бла 5 раз, то он будет соответствовать бла 5 раз. 4 из .* и последний от бла. Есть .*?blah(ленивая оценка), которая будет соответствовать любому персонажу до первого бла. хотя это требует -P. Но в вашем случае, ища /bin/java, вы не собираетесь получать / bin / java несколько раз в строке, так что нет ничего страшного в том, чтобы использовать .* без?.

Мне кажется немного глупым, чтобы получить ps печатать много информации, которую вы не хотите, а затем использовать комплекс grep выражение, чтобы извлечь то, что вы хотите. Следующий подход кажется более подходящим:

ps -C java -o cmd=

Это даст вам список аргументов из команды, но вы можете сократить его до аргумента 0 с помощью sed фильтр:

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

Если, как почти наверняка, нет пробелов в java путь, гораздо более простой фильтр можно использовать:

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

(На самом деле $ может быть опущен, так как "жадное" совпадение будет включать все символы вплоть до конца строки, хотя, как правило, также полезно включать его для удобочитаемости.)

Другие вопросы по тегам