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
示すために使用されます(詳細情報を参照)。この問題を解決する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 ' '
複数の空間を一つに「圧着」して準備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