egrep用于访问与某些字符串不匹配的日志记录

时间:2013-03-20 17:46:34

标签: regex grep

我有一个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

1 个答案:

答案 0 :(得分: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