我能够在regxr.com上构建正则表达式
/.*GET.*(?!(Chrome)).*"$/
我希望我的正则表达式与此行不匹配:
node_lum.log:C3 2019-04-15 15:00:28.954 NOTICE: 6ms 77.172.180.249 GET /users/zone/active.json?customer_name=hl_e5d4a218 HTTP/1.1 200 - - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
并匹配此
node_lum.log:C3 2019-04-15 15:00:28.954 NOTICE: 6ms 77.172.180.249 GET /users/zone/active.json?customer_name=hl_e5d4a218 HTTP/1.1 200 - - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) asd/73.0.3683.103 Safari/537.36"
我尝试同时使用vim和grep。
在vim上,我尝试过
/*GET.*\(Chrome\)\@!.*"$
/*GET.*\(\(Chrome\)\)\@!.*"$
在grep上,我尝试过
grep -P '.*GET.*(?!(Chrome)).*"$' ./grep.txt
grep -P '.*GET.*(?!Chrome).*"$' ./grep.txt
这些都没有让我得到我想要的比赛
答案 0 :(得分:2)
在grep
中,您应该删除第一个.*
(这是多余的),并确保下一个.*
位于负前瞻范围内:
GET(?!.*Chrome).*"$
^^
详细信息
GET
-一个GET
子字符串(?!.*Chrome)
-除行rbeak字符外的任何0+字符后,不允许Chrome
.*"$
-除换行符以外的任何0+字符都应尽可能多,并且必须在行尾出现"
。在Vim中,它看起来像
GET\(.*Chrome\)\@!.*"$
\(.*Chrome\)\@!
是负的超前提前量。