我有很多带有命令的日志。我用其中的“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
答案 0 :(得分: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"