我正在嘗試從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
- 你的命令:
ps -af -u sas | grep java | grep -v grep
tr -s ' '
將多個空間「擠壓」成一個空間,以準備cut
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
getopts -aql 'Dapp.name:' $(...)
解析命令選項並僅輸出與Dapp.name
具有值的人相符的長名稱(由 表示:
),結果為--Dapp.name 'myApp' --
cut -d"'" -f2
取得單引號中的內容- 結果是:
myApp