Shell-Script
如何從 ps 命令中提取鍵值對
我正在嘗試從
ps
這樣的命令中提取應用程序名稱:ps -af -u sas |grep "java"| grep -v "grep"
它產生以下內容:
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
我嘗試使用
egrep
但似乎不起作用:ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name"
我怎樣才能只獲得
-Dapp.name
值“myApp”?
與
awk
:ps -af -u sas | awk 'BEGIN {RS=" "}; /-Dapp.name/'
您沒有顯示收到的錯誤消息,但可能是
grep:未知設備方法
這是因為,像所有或至少大多數其他命令行程序一樣,
grep
假設以 a 開頭的任何內容-
都是一個選項並嘗試對其進行解析。在這種情況下,-D
用於指示grep
如何處理設備文件(詳見man grep
)。解決此問題的一種方法是使用--
which 告訴grep
後面的任何內容都不是選項標誌。將其與 GNU 的 PCRE 功能相結合
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]+')"