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

如何從 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”?

答案1

您沒有顯示收到的錯誤訊息,但它可能是

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]+')"

答案2

awk

ps -af -u sas | awk 'BEGIN {RS=" "}; /-Dapp.name/'

答案3

ps -af -u sas | sed -n '/[j]ava/s/.*-Dapp\.name=\([^ ]*\).*/\1/p'

答案4

比其他答案更複雜,但這用於getopt為您處理解析。還有另一種選擇。

getopt -aql 'Dapp.name:' $(\
    ps -af -u sas | grep java | grep -v grep | tr -s ' ' | cut -d' ' -f8-\
) | cut -d"'" -f2
  1. 你的命令:ps -af -u sas | grep java | grep -v grep
  2. tr -s ' '將多個空間「擠壓」成一個空間,以準備cut
  3. cut -d' ' -f8-用空格分割行並抓取 8 之後的所有欄位(含 8),結果為/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
  4. getopts -aql 'Dapp.name:' $(...)解析命令選項並僅輸出與Dapp.name具有值的人相符的長名稱(由 表示:),結果為--Dapp.name 'myApp' --
  5. cut -d"'" -f2取得單引號中的內容
  6. 結果是:myApp

相關內容