1

コマンドを含む多くのログがあります。「useradd」を含むすべてのログをフィルタリングしましたが、いくつかの誤検知を破棄したいと思います。

  • ... /etc/default/useradd ...
  • ... .../man8/useradd ...

問題は、偽陽性と実際のコマンドを含む行を見たいということです (テストケースを参照)。

ログアナライザープログラムを使用しているため、(1 つ以上の) Python 正規表現しか使用できません。したがって、実際の Python プログラムはありません。これらは私が試した表現です:

(!/etc/default/|/man8/)useradd # no match
(?<!/etc/default/|/man8/)useradd # look-behind requires fixed-width pattern
(?<!fault/|/man8/)useradd # works, but that's strange

他の質問への回答では、先読みを使用できるように正規表現が変更されましたが、ここでこれがどのように可能かわかりません。

[編集: いくつかのテストケースを追加]

## no match
cat /etc/default/useradd 
less /usr/share/man/ja/man8/useradd.8.gz
## match:
useradd evil
/usr/sbin/useradd
cat /etc/default/useradd; useradd evil
cat /etc/default/useradd; /usr/sbin/useradd evil
cat /etc/default/useradd; cd /usr/lib/; ../sbin/useradd evil
4

1 に答える 1

4

代わりに先読みアサーションを使用できます。

^(?!.*(?:/etc/default|/man8)/useradd(?!.*useradd)).*useradd

説明:

^               # Start of string
(?!             # Assert that it's impossible to match...
 .*             # any string, followed by...
 (?:            # this non-capturing group containing...
  /etc/default  # either "/etc/default"
 |              # or
  /man8         # "/man8"
 )              # End of group, followed by...
 /useradd       # "/useradd"
 (?!.*useradd)  # UNLESS another "useradd" follows further up ahead.
)               # End of lookahead
.*              # Match anything, then match
useradd         # "useradd"

regex101.comでライブをご覧ください。

于 2014-02-14T10:57:59.513 に答える