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

答え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

関連情報