2013-03-20 37 views
0

我有,在從碼頭訪問日誌egrep的訪問日誌記錄不匹配的一些字符串

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

我會提取所有的GET /管理/ HB記錄做得很好,現在想給egrep的獲取所有不是「GET/admin/hb」的行。它足以與egrep的-v簡單...

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

...但我最終會被把這個expresion成Groovy腳本,並想知道如何否定「/管理/ 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 
+0

嗯。這個答案是相關的,但我不知道如何整合它:http://stackoverflow.com/questions/406230/regular-expression-to-match-string-not-containing-a-word – 2013-03-20 18:04:22

回答

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 
+0

這樣做的工作,謝謝。但我留下了搔頭,爲什麼同樣的表達方式無法通過我的egrep。嗯。 – 2013-03-20 22:21:52

+0

因爲?!是一個perlism,使用-P調用grep的perlre個性。 – tink 2013-03-20 22:23:17