Próbuję wyodrębnić nazwę aplikacji z ps
polecenia w następujący sposób:
ps -af -u sas |grep "java"| grep -v "grep"
i produkuje:
sas 24431 1 0 Oct10 ? 00:51:08 /usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs
Próbowałem użyć, egrep
ale wydaje się, że nie działa:
ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name"
Jak mogę uzyskać tylko -Dapp.name
wartość „myApp”?
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.grep -o -- -Dapp.name
grep [j]ava
aby uniknąć poleceniagrep -v "grep"
(testowane na bash)Odpowiedzi:
Z
awk
:źródło
Nie wyświetla się wyświetlany komunikat o błędzie, ale prawdopodobnie jest to możliwe
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 (zobaczman 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: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:Jeśli chcesz
myApp
zapisać część w zmiennej, szukałbym tego sam:Aby przypisać ją do zmiennej:
Jednak nigdy nie powinieneś uzyskiwać
grep
rezultatówps
dla tego rodzaju rzeczy, właśnie po topgrep
:źródło
źródło
Za każdym razem, gdy używasz
ps … | grep …
i chcesz wykluczyć grep z wyników, robisz to źle.Zerową zasadą parsowania wyniku
ps
jest użycie bardziej niezawodnych narzędzi, takich jakpgrep
dostępne. Jeśli masz pgrep,pgrep -f java
wyświetla listę wszystkich procesów uruchamiających poleceniejava
. Opcja-l
dodaje wiersz poleceń dla każdego procesu.Aby wyodrębnić argument
-Dapp.name
, możesz użyć sed. Dopasuj całą linię, umieść ciekawą część w grupie i wydrukuj tę grupę.Pierwszą zasadą analizowania danych wyjściowych
ps
jest użycie opcji-o
do wybrania potrzebnych pól. Tutaj interesują Cię tylko argumenty poleceń, więc wypisz tylko to.źródło
Bardziej skomplikowane niż inne odpowiedzi, ale służy to
getopt
do obsługi analizy. Jeszcze jedna alternatywa.ps -af -u sas | grep java | grep -v grep
tr -s ' '
„ściska” wiele spacji w jedną przestrzeń w ramach przygotowańcut
cut -d' ' -f8-
dzieli linię przez spacje i pobiera wszystkie pola po 8 włącznie, wynikiem jest/usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs
getopts -aql 'Dapp.name:' $(...)
analizuje opcje polecenia i zwraca tylkoDapp.name
długą nazwę, która pasuje do tego, kto ma wartość (oznaczoną przez:
), wynikiem jest--Dapp.name 'myApp' --
cut -d"'" -f2
chwyta rzeczy w pojedyncze cytatymyApp
źródło
Chciałbym użyć
pgrep
zamiastps
tak:Spowoduje to zwrócenie wszystkich pasujących procesów,
java
a następnie odfiltruje te, pokazując tylko te, które zawierają-Dapp.name=
. Ostatni bit\w+
pokaże nazwę programu, zakładając, że nie zawiera spacji.UWAGA:
-P
przełącznikgrep
werbuje zdolność do określenia rzeczy za pomocą PCRE - pcre . Nie wszystkie wersjegrep
go obsługują, ale większość z nich jest dołączana do bardziej nowoczesnych wersji Linuksa.Jeśli chcesz otrzymać cały wynik klucz / wartość, zmień takie rzeczy:
źródło