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 つの方法は、に続くものはすべてオプション フラグではないことを指示するを使用することです。grep
man 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
の出力は絶対にすべきではありません。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 ' '
複数のスペースを1つのスペースに「圧縮」して、cut
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
getopts -aql 'Dapp.name:' $(...)
コマンドオプションを解析し、Dapp.name
値を持つものと一致するロングネームのみを出力します( で示されます:
)。結果は次のようになります。--Dapp.name 'myApp' --
cut -d"'" -f2
シングルクォーテーション内の内容を取得します- 結果は次のとおりです:
myApp