Nie wyświetla się wyświetlany komunikat o błędzie, ale prawdopodobnie jest to możliwe
grep: metoda nieznanych urządzeń
Dzieje się tak, ponieważ, podobnie jak wszystkie inne programy wiersza poleceń, grep
zakłada, że wszystko, co zaczyna się na a, -
jest opcją i próbuje je parsować jako takie. W takim przypadku -D
służy do instruowania, grep
jak postępować z plikiem urządzenia (zobacz man grep
szczegóły). Jednym ze sposobów obejścia tego jest użycie, --
które mówi, grep
że cokolwiek następuje nie jest flagą opcji.
Łącząc to z funkcją GNU PCRE grep
, możesz:
ps -af -u sas | grep -v grep | grep -Po -- '*-\KDapp.name=[^\s]+'
Wyrażenie regularne szuka a -
i odrzuca je ( \K
), a następnie ciąg znaków, Dapp.name=
po którym następuje jak najwięcej znaków spacji, jak to możliwe. Dane wyjściowe to:
Dapp.name=myApp
Jeśli chcesz myApp
zapisać część w zmiennej, szukałbym tego sam:
ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+'
Aby przypisać ją do zmiennej:
$ app="$(ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+')"
$ echo $app
myApp
Jednak nigdy nie powinieneś uzyskiwać grep
rezultatów ps
dla tego rodzaju rzeczy, właśnie po to pgrep
:
app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"
grep
wzór zaczyna się od-
, musisz umieścić go po-e
opcji. W przeciwnym razie będzie to traktowane jako opcja. Ale to po prostu pasuje do słowa-Dapp.name
, a nie do części po nim.