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

376
Barry

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

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

-3
Помимо цитирования, что не так с вашей командой? AFH 8 лет назад 0
Привет AFH Я вижу дополнительную цитату спасибо. Проблема не в самом цикле, возможно, в этом было слишком много информации. Все, что я хочу показать, это работающая версия Java. Я ищу какой-то вид grep: grep -o '/ * java', который будет отображать только команду java без параметров или других атрибутов из ps Barry 8 лет назад 0
в основном вы хотите хорошее регулярное выражение barlop 8 лет назад 0
Да, это все, что я ищу. Я выбрал плохое название для вопроса, извините за это. Я исправил название и упростил мою проблему, Barry 8 лет назад 0
как насчет `grep -oP" /.*?/ bin / java "` Это будет происходить с первого найденного прямого слеша, затем попытаться найти совпадение до первого появления / bin / java. Столица P получает хорошую поддержку регулярных выражений от Grep barlop 8 лет назад 0
или это и не нужно -P с grep даже. `grep -oP" /.*/ bin / java "` Начинается с первого слеша вперед, затем максимально соответствует любому символу вплоть до / включая / bin / java. barlop 8 лет назад 0
Отлично, я могу работать с ними обоими отсюда! Большое спасибо. Barry 8 лет назад 0
да, и если вам приходилось самим решать это с нуля, то, помимо знания регулярных выражений, вы можете быстро протестировать вещи с помощью echo, например, `echo user pid # 1 1 00:00? 00:04:00 /path/to/java/jdk_1.8/bin/java -foo = bar -foo2 = bar2 ... и т. Д. | grep `тогда попробуй шаблоны. И вы можете добавить -i к grep egor, смешанному с -o так -io, чтобы сделать его нечувствительным к регистру (что делает -i) .. barlop 8 лет назад 0

2 ответа на вопрос

0
AFH

Кажется немного ненормальная для меня, чтобы 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
barlop

Как насчет того, grep -oP "/.*?/bin/java"что будет происходить с первой найденной им обратной косой черты, а затем попытаться найти совпадение до первого появления / bin / java. Столица P получает хорошую поддержку регулярных выражений от grep

или это и не нужно -P с grep даже. grep -oP "/.*/bin/java"Начинается с первой косой черты, затем максимально соответствует любому символу вплоть до / включая / bin / java.

И если вам приходилось самим решать это с нуля, то, помимо знания регулярных выражений, вы можете быстро проверить эхо, например, 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 несколько раз подряд, так что нет ничего страшного в том, чтобы использовать .*без?

Похожие вопросы