2015-06-02 4 views
2

От ps -ef командный выход -Dorg.xxx.yyy=/home/user/aaa/server.log.grep часть текста из вывода ps с регулярным выражением

Я хотел бы извлечь путь к файлу /home/user/aaa/server.log (может быть любым файлом name.file).

Теперь я использую команду:

ps -ef | grep -Po '(?<=-Dorg.xxx.yyy=)[^\s]*' 

Он будет отображать две совпавшие результаты:

/home/user/aaa/server.log 
)[^\s]* 

Похоже, он считает команду, а для 2-го соответствует результату. Как его удалить? Или есть другие предложения? (Я не могу использовать -m1).

+1

У меня нет такого поведения, с версией grep вы используете? 'grep --version' – chaos

+0

это grep (GNU grep) 2.18 – user1684651

+0

Я думаю, что это правильное поведение, потому что ps -ef также указан в его результате – user1684651

ответ

1

Если вам просто нужно имя файла, используйте \K оператор:

org\.xxx\.yyy=\K[^\s]* 

ps -ef | grep -Po 'org\.xxx\.yyy=\K[^\s]*' 

Это будет соответствовать всей строке, но будет печатать только имя файла, согласованный с [^\s]*.

От perlre:

Существует особая форма этой конструкции, которая называется \ K (доступен с Perl 5.10.0), что приводит к регулярному выражению двигатель «держать» все, что было соответствие перед к \ K и не включать его в $ &. Этот эффективно обеспечивает внешний вид переменной длины.

+0

Если вы нашли мой ответ полезным, пожалуйста, также подумайте о повышении. –

1

Использование что:

grep -Po '(?<=-[D]org.xxx.yyy=)[^\s]*' 

Просто поместите один из символов в квадратных скобках ([D]). Значение регулярного выражения не изменилось, и шаблон больше не соответствует.

+0

Сладкий трюк! Это будет мой инструментарий. – Cometsong