我试图在我的目录中的文件中像这样fgrep一个正则表达式
fgrep -i ".*HTTP/1\.1\" (?\!200).*" *
但我没有得到任何输出。
我想要grep的正则表达式是.*HTTP\/1.1" (?!200).*
,它应该grep所有出现的任何东西,从 HTTP / 1.1“除200 以外的任何东西;基本上任何HTTP响应,但200。< / p>
我还使用在线正则表达式测试程序测试了正则表达式并且匹配
HTTP/1.1" 400
HTTP/1.1" 500
HTTP/1.1" 404
我有什么不对劲吗?我应该怎么做?
答案 0 :(得分:1)
fgrep与grep -F
模式相同,后者将模式视为固定字符串,而不是正则表达式。
假设您拥有支持PCRE的GNU grep:
$ printf 'HTTP/1.1" 400\nHTTP/1.1" 500\nHTTP/1.1" 200\n' |
grep -P ".*HTTP/1\.1\" (?\!200).*"
HTTP/1.1" 400
HTTP/1.1" 500
或POSIXly,使用awk
:
awk '!/HTTP\/1\.1" 200/ && /HTTP\/1\.1/'
答案 1 :(得分:0)
你逃脱了#34;!&#34;在你的正则表达式。
".*HTTP\/1\.1\" (?!200).*"
答案 2 :(得分:0)
遗留命令fgrep
(现在称为grep -F
)特别是不支持正则表达式的grep
家庭成员。它只搜索文字字符串。
您的正则表达式对grep
或egrep
(又名grep -E
)无效,因为您使用了?!
之类的Perl正则表达式扩展。使用GNU grep
,您可以将它们与grep -P
一起使用。
grep -P 'HTTP/1\.1" (?!200)...' ./*
还要注意无用的前导和尾随上下文是如何不必要的,以及dot如何而不是斜线需要转义。 (它也可以在没有逃避的情况下工作,但理论上匹配你不想匹配的东西。)