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: 不明なデバイス方法

これは、すべてまたは少なくとも他のほとんどのコマンドラインプログラムと同様に、grepaで始まるすべてが-オプションであると仮定し、そのように解析しようとするためです。この場合、デバイスファイルの処理方法を-D示すために使用されます(詳細情報を参照)。この問題を解決する1つの方法は、次のものがオプションフラグではないことを知らせるものを使用することです。grepman grep--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出力しないでください。pspgrep使用:

app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"

おすすめ記事