![Мне нужна помощь в создании регулярного выражения для grep, которое будет показывать только путь к запущенным версиям Java.](https://rvso.com/image/1493939/%D0%9C%D0%BD%D0%B5%20%D0%BD%D1%83%D0%B6%D0%BD%D0%B0%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%20%D0%B2%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B8%20%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B4%D0%BB%D1%8F%20grep%2C%20%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%B5%20%D0%B1%D1%83%D0%B4%D0%B5%D1%82%20%D0%BF%D0%BE%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D1%82%D1%8C%20%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D0%BF%D1%83%D1%82%D1%8C%20%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%83%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%20%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8F%D0%BC%20Java..png)
Мне нужна помощь в создании 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/ .*$//'
(На самом деле его $
можно опустить, так как «жадное» совпадение будет включать все символы до конца строки, хотя обычно его лучше включить для удобства чтения.)