【问题标题】:Parsing timestamp in nginx logs解析nginx日志中的时间戳
【发布时间】:2016-12-31 08:27:33
【问题描述】:

我需要帮助,因为我是日志解析新手。我正在尝试提取所有状态为 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+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F48.0.2564.97+Safari%2F537。 36&lang=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 美国 /

【问题讨论】:

    标签: regex bash nginx


    【解决方案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}) 定义的小时、分钟、秒和末尾的状态码 ([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})的状态码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 2014-11-01
      • 2020-12-29
      • 1970-01-01
      • 2013-12-01
      相关资源
      最近更新 更多