Мне нужна помощь в создании регулярного выражения для 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/ .*$//'
(На самом деле $
может быть опущен, так как "жадное" совпадение будет включать все символы вплоть до конца строки, хотя, как правило, также полезно включать его для удобочитаемости.)