Shell-Script

如何從 ps 命令中提取鍵值對

  • January 15, 2017

我正在嘗試從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]+')"

引用自:https://unix.stackexchange.com/questions/162319