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