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

Мне нужна помощь в создании регулярного выражения для 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

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

решение1

Что насчет 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, поэтому -io, чтобы сделать его нечувствительным к регистру (что делает -i).

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

решение2

Мне кажется немного глупым печатать 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/ .*$//'

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

Связанный контент