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で始まるものはすべて-オプションであると想定し、そのように解析しようとするためです。この場合、 はデバイス ファイルの処理方法を-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 ' '複数のスペースを1つのスペースに「圧縮」して、cut
  3. cut -d' ' -f8-行をスペースで分割し、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

関連情報