2013-03-20 1 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을 가하고되고 "/ 관리/HB"부분을 부정하는 방법을 알고 싶습니다하지만. 부정적인 lookaround에 나의 약한 시도는 실패했다; 그것은 전혀 줄을 일치시키지 않습니다.

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 –

답변

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

그게 작동합니까, 감사. 그러나 나는 왜 내 표현을 통해 같은 표현이 작동하지 않는지 내 머리를 긁어 버린다. 흠. –

+0

왜냐하면!?! perlism이며, -P를 사용하면 grep의 개성이 생깁니다. – tink

관련 문제