-1

HTTP 消息列在问题之后。

  1. 我需要一个正则表达式来查找两条消息中的 HTTP 状态代码。
  2. 另一个在两条消息中都找到请求用户的名称。
  3. 在两条消息中找到时间戳的最后一个。
127.0.0.1 - Johny [17/Dec/2010:17:15:16 -0700] "GET /apache_pb.gif  
HTTP/1.0" 200 2326

127.0.0.1 - debbie7 [19/Dec/2010:11:11:02 -0700] "GET /apache_pbs.gif   
HTTP/1.0" 404 2336

谢谢!

4

4 回答 4

2

描述

您可以使用此正则表达式一次性提取值 {username, date, and http code}:

^.*?-\s(\S*)\s+\[([^\]]*)\]\s"[^"]*"\s(\d+)\s\d+

在此处输入图像描述

团体

第 0 组获得整行,而其他组将分别获得各自的匹配项。

  1. 获取用户名
  2. 获取日期戳
  3. 获取http状态码

PHP 代码示例:

您没有选择语言,所以我提供了一个 php 示例来展示正则表达式的工作原理

给定输入字符串,在消息区域的中间完成链接中断

127.0.0.1 - Johny [17/Dec/2010:17:15:16 -0700] "GET /apache_pb.gif 
HTTP/1.0" 200 2326

127.0.0.1 - debbie7 [19/Dec/2010:11:11:02 -0700] "GET /apache_pbs.gif 
HTTP/1.0" 404 2336

代码示例

<?php
$sourcestring="your source string";
preg_match_all('/^.*?-\s(\S*)\s+\[([^\]]*)\]\s"[^"]*"\s(\d+)\s\d+/im',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

$matches Array:
(
    [0] => Array
        (
            [0] => 127.0.0.1 - Johny [17/Dec/2010:17:15:16 -0700] "GET /apache_pb.gif 
HTTP/1.0" 200 2326
            [1] => 127.0.0.1 - debbie7 [19/Dec/2010:11:11:02 -0700] "GET /apache_pbs.gif 
HTTP/1.0" 404 2336
        )

    [1] => Array
        (
            [0] => Johny
            [1] => debbie7
        )

    [2] => Array
        (
            [0] => 17/Dec/2010:17:15:16 -0700
            [1] => 19/Dec/2010:11:11:02 -0700
        )

    [3] => Array
        (
            [0] => 200
            [1] => 404
        )

)
于 2013-06-12T02:37:06.867 回答
0

在 Perl 中:

!([a-zA-Z]+) \W+          
 (.* -) [\w\W]+
 HTTP/1.0" \ ([\d]+)
!x

$1 -> username
$2 -> timestamp
$3 -> status
于 2013-06-12T03:59:26.683 回答
0

HTTP 状态:

(?<=HTTP/1.0" )\d+

请求用户(适用于任何 IP 地址):

(?<=(\d\d?\d?\.){3}\d\d?\d? - )\w+(?= \[)

时间戳:

(?<=\[).*(?=\])
于 2013-06-12T02:31:29.160 回答
0

您可以尝试使用此正则表达式来实现此目的:

^.* (\w*) \[([^\]]*)] \"[\w.\/ ]*\" ([\d]+)

输入:

127.0.0.1 - Johny [17/Dec/2010:17:15:16 -0700] "GET /apache_pb.gif  
HTTP/1.0" 200 2326

输出:

Group 1: Johny
Group 2: 17/Dec/2010:17:15:16 -0700
Group 3: 200

您可以在此处测试正则表达式。

于 2013-06-12T03:38:38.993 回答