fgrep命令行终端中的正则表达式

时间:2015-10-29 07:49:23

标签: regex grep

我试图在我的目录中的文件中像这样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

我有什么不对劲吗?我应该怎么做?

3 个答案:

答案 0 :(得分:1)

fgrepgrep -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家庭成员。它只搜索文字字符串。

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

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

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

相关问题