解析nginx日志中的时间戳

时间:2016-12-29 23:06:09

标签: regex bash nginx

我需要帮助,因为我是新手来解析日志。我正在尝试提取具有200状态的所有日志行,在15:35之前的时间戳为15小时。我无法弄清楚要使用的正则表达式。

以下是日志示例:

  

198.104.78.160 [26 / Dec / 2016:15:24:12 -0500] 200 190.50.175.65:8080 200 testtest.com GET /api/bid_request?feed=1&auth=qwerty&ip=85.194.119.3 &安培; UA = Mozilla的%2F5.0 +%28Windows + NT + 6.1%3B + Win64的%3B + 64%+ 29%为AppleWebKit + 2F537.36%28KHTML%2C +等+壁虎%29 +%铬2F48.0.2564。 97 +%的Safari&2F537.36放大器;朗= TR-TR%2Ctr%3BQ%3D0.8%2Cen-US%3BQ%3D0.6%2Cen%3BQ%3D0.4&安培; REF = HTTP%3A%2F%2Fserve。 pop.net%2FS   HTTP / 1.0 - - - 174.194.36.141 - 0.109-0.009 US /

1 个答案:

答案 0 :(得分:1)

您可以使用awk来执行此操作:

awk -v status_code=200 -v ts_at_hour=15 -v ts_before_hour=15 -v ts_before_min=35 '

    {
        match($0, /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\s+\[[0-9]{2}\/[a-zA-Z]{3}\/[0-9]{4}:([0-9]{2}):([0-9]{2}):([0-9]{2})\s+[+-][0-9]{4}\]\s+([0-9]{3})/, items)

        if (items[1] == ts_at_hour && 
            items[1] <= ts_before_hour && 
            items[2] < ts_before_min &&
            items[4] == status_code){
          print $0
        }
    }
' data.txt

设置一些变量来存储您的需求status_codets_at_hourts_before_hourts_before_min(您可以为它们定义环境变量)

正则表达式是match,专注于4组:([0-9]{2})定义的小时,分​​钟,秒和结束时的status_code ([0-9]{3})

要分解正则表达式,您有:

  • IP地址[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+后跟空格\s+(或更多)
  • 包含小时,分钟和秒\[[0-9]{2}\/[a-zA-Z]{3}\/[0-9]{4}:([0-9]{2}):([0-9]{2}):([0-9]{2})\s+[+-][0-9]{4}\]的日期部分(请注意()之间的3组)
  • 状态代码为([0-9]{3})