実行中のJavaバージョンへのパスのみを表示するgrepの正規表現の構築に助けが必要です

実行中のJavaバージョンへのパスのみを表示するgrepの正規表現の構築に助けが必要です

ps -ef から grep を構築して Java パスのみを返す方法について助けが必要です。

次のような実行中のプロセスがあるとします。

bash> ps -ef | grep java
user  pid#      1  1 00:00 ?        00:04:00 /path/to/java/jdk_1.8/bin/java -foo=bar -foo2=bar2 ... etc.

私がこれから何をしたかは、次のものを表示することです:

bash> ps -ef | grep 'some regex or pattern here'
/path/to/java/jdk_1.8/bin/java

皆さんありがとう。

答え1

grep -oP "/.*?/bin/java"最初に見つかったスラッシュから/bin/javaの最初の出現まで一致を試みるというのはどうでしょうか。大文字のPはgrepから適切な正規表現サポートを受けます。

または、grep の -P も必要ありません。grep -oP "/.*/bin/java"最初のスラッシュから始まり、/bin/java までの任意の文字に可能な限り一致します。

そして、自分でゼロから解決しなければならない場合は、正規表現について知っていることに加えて、echo eg を使用してすばやくテストしてからecho user pid# 1 1 00:00 ? 00:04:00 /path/to/java/jdk_1.8/bin/java -foo=bar -foo2=bar2 ... etc. | grep、パターンを試すことができます。また、grep eg に -i を追加したり、-o と混ぜて -io にしたりして、大文字と小文字を区別しないようにすることができます (-i の機能)。

注記: 上記は問題ありませんが、正規表現や技術的な詳細に興味があるなら、 .*blah(.*貪欲評価) には blah を含めることができるので、blah が 5 回ある場合、blah が 5 回一致します。4 回目は blah から.*、最後は blah から。.*?blah(遅延評価) があり、これは最初の blah まで任意の文字と一致します。ただし、これには -P が必要です。ただし、/bin/java を探している場合、/bin/java が 1 行に複数回表示されることはないので、?.*なしで を使用することは大した問題ではありません。

答え2

ps不要な情報を大量に印刷し、複雑なgrep式を使って必要な情報を抽出するのは、ちょっと馬鹿げているように思える。する欲しい。次の方法の方が良いようです:

ps -C java -o cmd=

これにより、コマンドからの引数リストが提供されますが、フィルターを使用して引数 0 に絞り込むことができますsed

ps -C java -o cmd= | sed 's%\(/java\) .*$%\1%'

ほとんどの場合、パスにスペースが含まれていない場合は、はるかjavaに単純なフィルターを使用できます。

ps -C java -o cmd= | sed 's/ .*$//'

(実際には$、「貪欲な」一致では行末までのすべての文字が含まれるため、 は省略できますが、読みやすさのために を含める方がよい場合がほとんどです。)

関連情報