Ви не показуєте повідомлення про помилку, яке ви отримуєте, але це, ймовірно,
grep: метод невідомих пристроїв
Це тому, що, як і всі або принаймні більшість інших програм командного рядка, grep
передбачається, що все, що починається з а, -
є варіантом і намагається проаналізувати його як таке. У цьому випадку -D
використовується для вказівки grep
щодо того, як поводитися з файлом пристрою (див. man grep
Подробиці). Одним із способів подолати це є використання, --
яке говорить grep
про те, що все, що випливає, - це не прапор опції.
Поєднавши це з можливістю PCRE GNU grep
, ви можете:
ps -af -u sas | grep -v grep | grep -Po -- '*-\KDapp.name=[^\s]+'
Регулярний вираз шукає a -
і відкидає його ( \K
), потім рядок, Dapp.name=
за яким слідує якомога більше символів, що не містять пробілів. Вихід:
Dapp.name=myApp
Якщо ви хочете, щоб myApp
частина була збережена у змінній, я б шукав її самостійно:
ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+'
Щоб призначити його змінній:
$ app="$(ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+')"
$ echo $app
myApp
Однак ви ніколи не повинні отримувати grep
результати ps
для подібних речей, ось для чого pgrep
:
app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"
grep
візерунок починається з-
, потрібно поставити його після-e
опції. В іншому випадку це буде розглядатися як варіант. Але це буде відповідати лише слову-Dapp.name
, а не частині після нього.