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