fgrep命令行终端中的regex



我正试图在终端中像这样在目录中的文件中fgrep一个regexfgrep -i ".*HTTP/1.1" (?!200).*" *,但我没有得到任何输出。

我想要grep的regex是.*HTTP/1.1" (?!200).*,它应该grep所有出现的以任何东西开始并具有HTTP/1.1"除200以外的任何东西;基本上是除200之外的任何HTTP响应。

我还用在线正则表达式测试仪测试了正则表达式,它匹配HTTP/1.1" 400HTTP/1.1" 500HTTP/1.1" 404

我做错什么了吗?我应该怎么做?

fgrep与grep -Fpattern相同,后者将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家族成员,不支持正则表达式。它只搜索文字字符串。

您的正则表达式对grepegrep(也称为grep -E)也无效,因为您使用了类似?!的Perl正则表达式扩展。使用GNU grep,您可以将它们与grep -P一起使用。

grep -P 'HTTP/1.1" (?!200)...' ./*

还要注意无用的前导和尾随上下文是如何不必要的,以及点而非斜杠是如何需要转义的。(它也可以在不转义的情况下工作,但理论上可以匹配你不想匹配的东西。)

最新更新