拡張正規表現(ERE):一致にパターンを含めますが、パターンの特定の親セットを除外する方法は?

拡張正規表現(ERE):一致にパターンを含めますが、パターンの特定の親セットを除外する方法は?

コマンドのマニュアルページには、pgrepパターンが「プロセス名またはコマンドラインを一致させるために使用される拡張正規表現を指定します」と指定されています。明らかに、拡張正規表現は、元のUNIX grepコマンドで使用されていた正規表現の拡張です。

その文字列を一致させることができるはずですが、拡張正規表現を使用して'myProcess'除外する必要があります。'test_myProcess'最初に、拡張正規表現が否定的なLookBehindアサーションをサポートすると仮定し、その結果、次の正規表現を取得しました(?<!test_)(myProcess)。これは明らかに他の正規表現ツールと連携します(Regex101 Webサイトで試しました)。

ただし、この機能を使用しようとすると、pgrep次のエラーが発生しますInvalid preceding regular expression。いくつかの拡張正規表現ページを見た後、このタイプの正規表現に対する否定的なLookbehindの主張が存在しないようです(または少なくともそれに対する参照が見つかりません)。文字列を一致させる方法を知る必要があります 'myProcess'が、拡張正規表現を使用して "test_myProcess"文字列を除外する必要があります。

編集する: 一致する(または一致しない)テキストの例が必要です。 必須一致:

  • 私のプロセス
  • /usr/local/bin/myProcess.py
  • /usr/bin/myProcess

マッチいいえ期待する:

  • 私のプロセスをテストしてください
  • /usr/local/bin/test_myProcess.py
  • /usr/bin/test_myProcess

今度はpgrepを2回実行して1回は一致し、1回は一致するように'myProcess'実行し、2つの'test_myProcess'結果の違いを正解にするつもりです。しかし、私は代替ソリューションには確かに興味があります。

編集する: プロセス名自体にはが含まれておらず、'myProcess'そのプロセスのコマンドラインにのみ表示されます。プロセス名はpython2.7。また、'myProcess'文字列の先頭または末尾を占めるという保証もありません。また、指摘したように文字列が'myProcess'存在すれば一致させたいのですが、'test_myProcess'存在すれば一致しません。

答え1

@don_crisstiと多くの議論の最後に、最終的な解決策は次のとおりです。

ps auxf | grep -E '[m]yProcess' | grep -vE 'test_[m]yProcess'

これは最初にその行を含むすべての行を取得し、次にその行'myProcess'を含まないすべての行と一致します'test_myProcess'(-v一致を反転)。括弧と組み合わせた-Eは、grep出力にリストされる2つのプロセスが一致するのを防ぐためのものですps。これは、すべてを支配する1つの正規表現を見つけるよりもはるかに簡単であることがわかりました。みんなの助けに感謝します。

答え2

(?<!)Perl 正規表現演算子です。標準EREの仕様を見つけることができます。ここ

myProcessパラメータリストがで始まるか、またはを含むプロセスを探しているようです/myProcess

だから:

pgrep -f '(^|/)myProcess'

答え3

pgrepもしそうなら、名前が「myProcess」で始まるプロセスが欲しいですか?次に正規表現を使用してください^myProcess

pgrep '^myProcess'

正規表現では、この文字は、次の^内容が文字列の先頭に見つかる必要があることを意味します。

例:

$ pgrep -a app 
3267 nm-applet
3280 /usr/bin/python /usr/share/system-config-printer/applet.py
3297 /usr/lib/mate-panel/wnck-applet
3306 /usr/lib/mate-panel/clock-applet

$ pgrep -a '^app'
3280 /usr/bin/python /usr/share/system-config-printer/applet.py

関連情報