我正试图在终端中像这样在目录中的文件中fgrep一个regexfgrep -i ".*HTTP/1.1" (?!200).*" *
,但我没有得到任何输出。
我想要grep的regex是.*HTTP/1.1" (?!200).*
,它应该grep所有出现的以任何东西开始并具有HTTP/1.1"除200以外的任何东西;基本上是除200之外的任何HTTP响应。
我还用在线正则表达式测试仪测试了正则表达式,它匹配HTTP/1.1" 400
HTTP/1.1" 500
HTTP/1.1" 404
我做错什么了吗?我应该怎么做?
fgrep与grep -F
pattern相同,后者将pattern视为固定字符串,而不是正则表达式。
假设您拥有支持PCRE的GNU grep:
$ printf 'HTTP/1.1" 400nHTTP/1.1" 500nHTTP/1.1" 200n' |
grep -P ".*HTTP/1.1" (?!200).*"
HTTP/1.1" 400
HTTP/1.1" 500
或POSIXly,使用awk
:
awk '!/HTTP/1.1" 200/ && /HTTP/1.1/'
您在正则表达式中转义了"!"。
".*HTTP/1.1" (?!200).*"
遗留命令fgrep
(现在POSIX称为grep -F
)是grep
家族成员,不支持正则表达式。它只搜索文字字符串。
您的正则表达式对grep
或egrep
(也称为grep -E
)也无效,因为您使用了类似?!
的Perl正则表达式扩展。使用GNU grep
,您可以将它们与grep -P
一起使用。
grep -P 'HTTP/1.1" (?!200)...' ./*
还要注意无用的前导和尾随上下文是如何不必要的,以及点而非斜杠是如何需要转义的。(它也可以在不转义的情况下工作,但理论上可以匹配你不想匹配的东西。)