【问题标题】:POSIX regex not working with [:digit:] character classPOSIX 正则表达式不适用于 [:digit:] 字符类
【发布时间】:2017-01-18 14:29:31
【问题描述】:

我在日志文件access_20170118_14.log 中有以下日志行 -

127.0.0.1 - - [18/Jan/2017:14:22:16 +0000]  "GET //fam/shared_generate_test_devicelist.php HTTP/1.1" 200 168 "-" "curl/7.40.0" - 0.008
127.0.0.1 - - [18/Jan/2017:14:22:24 +0000]  "GET //fam/shared_generate_test_devicelist.php HTTP/1.0" 200 168 "-" "curl/7.40.0" - 0.008

以下是一个 nginx logwarn 命令,它从这个日志文件中打印出那些 HTTP 访问代码不同于 200 和 204 的日志行。

/usr/local/nagios/libexec/check_logwarn -d /tmp/logwarn_nginx_access /mnt/log/nginx/access_20170118_14.log '!.*HTTP/1.(1|0)\"\s*(200|204)' 

上述命令中的正则表达式按预期工作。

但是,我想去掉 (1|0),它是为了匹配 HTTP 版本 1.0 和 1.1 而添加的,并将其替换为任何数字,以便它适用于任何版本的 HTTP。

以下带有 [:digit:] 字符类的命令与 HTTP 版本 1.1 和 1.0 以及访问代码 200 的行匹配 -

/usr/local/nagios/libexec/check_logwarn -d /tmp/logwarn_nginx_access /mnt/log/nginx/access_20170118_14.log '!.*HTTP/1.[:digit:]\"\s*(200|204)' 

输出(不是我想要的) -

Log errors: 127.0.0.1 - - [18/Jan/2017:14:22:16 +0000]  "GET //fam/shared_generate_test_devicelist.php HTTP/1.1" 200 168 "-" "curl/7.40.0" - 0.008
127.0.0.1 - - [18/Jan/2017:14:22:24 +0000]  "GET //fam/shared_generate_test_devicelist.php HTTP/1.0" 200 168 "-" "curl/7.40.0" - 0.008

【问题讨论】:

  • 也许你可以尝试 \d 代替(到目前为止你已经在使用 \s)?
  • 正则表达式中的前导!,那是什么?

标签: regex nginx posix


【解决方案1】:

POSIX 字符类应在正则表达式字符类中使用,因此单个数字可以表示为:

[[:digit:]]

注意双括号。请参阅this document 了解更多信息。

另外,您有一个裸露的 . 代表一个句点(我猜想) - 应该用反斜杠将其转义为 \. 以表示一个文字句点。

【讨论】:

猜你喜欢
  • 2015-11-02
  • 2020-07-07
  • 2018-02-05
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
相关资源
最近更新 更多