1

我有很多带有命令的日志。我过滤了所有带有“useradd”的日志,但现在我想丢弃一些误报:

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

问题是我想在其中看到带有误报和真实命令的行(请参阅测试用例)。

我只能使用(一个或多个)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 回答