-3

Мне нужна помощь в создании 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 ответа2

0

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .