0

我有一个 egrep 可以很好地从 Jetty 访问日志中提取所有 GET /admin/hb 记录

egrep '^.*? ".+? /admin/hb .*?".*?$' /m1/logs/ap*access*2013_03_19.log

我现在想获取所有不是“GET /admin/hb”的行。使用 egrep -v 很简单...

egrep -v '^.*? ".+? /admin/hb .*?".*?$' /m1/logs/ap*access*2013_03_19.log

...但我最终会将这个表达式放入 Groovy 脚本中,并且想知道如何否定“/admin/hb”部分。我对消极环顾的微弱尝试失败了;它根本不匹配任何行。

egrep '^.*? ".+? ^(?!/admin/hb) .*?".*?$' /m1/logs/ap*access*2013_03_19.log

如何让 egrep 生成所有与 /admin/hb 不匹配的访问日志行?

测试数据集如下。我希望解决方案跳过第一行,但匹配接下来的两行:

127.0.0.1 -  -  [20/Mar/2013:16:37:08 +0000] "GET /admin/hb HTTP/1.1" 200 105  4
10.23.68.60 -  -  [20/Mar/2013:16:37:08 +0000] "GET /$PIT$/AUS/admin/hb HTTP/1.1" 200 0  4
10.23.68.64 -  -  [20/Mar/2013:16:36:47 +0000] "GET /handsets/dmhc HTTP/1.1" 200 0  1
4

1 回答 1

2

这适用于您的 grep 版本吗?

grep -P '^.*? "\S+?(?! /admin/hb) .*?".*?$' groovy
10.23.68.60 -  -  [20/Mar/2013:16:37:08 +0000] "GET /$PIT$/AUS/admin/hb HTTP/1.1" 200 0  4
10.23.68.64 -  -  [20/Mar/2013:16:36:47 +0000] "GET /handsets/dmhc HTTP/1.1" 200 0  1
于 2013-03-20T19:20:07.477 回答