过滤特定时间范围内的日志文件数据

时间:2018-01-13 18:12:48

标签: bash shell centos sh logfile

我想编写一个脚本,询问用户我们想要过滤日志数据的时间间隔的第一个和最后一个日期和时间,我需要一些帮助。

我不知道如何真正找到该范围内的数据,因为我无法使用单个正则表达式。

我的日志文件如下所示:

108.162.221.147 - - [04/Aug/2016:18:59:59 +0200] "GET / HTTP/1.1" 200 10254 "-"...
141.101.99.235 - - [04/Aug/2016:19:00:00 +0200] "GET / HTTP/1.1" 200 10255 ...
108.162.242.219 - - [04/Aug/2016:19:00:00 +0200] "GET / HTTP/1.1" 200 10255...
185.63.252.237 - - [04/Aug/2016:19:00:00 +0200] "CONNECT...
108.162.221.147 - - [04/Aug/2016:19:00:00 +0200] "GET /?...
185.63.252.237 - - [04/Aug/2016:19:00:01 +0200] "CONNECT....
etc...

我的剧本:

#!/bin/bash
echo "enter the log file name  "
read fname

echo "enter the start date and time  "
read startdate

echo "enter the end fate and time  "
read enddate

result=$(some code for filtering rows from this range)
echo "$result" > 'log_results'
echo "results written into /root/log_results file"

我尝试使用

sed -n "/"$startdate"/,/"$enddate"/p" "fname"

由于斜线无法看到日期格式,因为它只找到日志中的那2个日期(也许我写错了)

我该怎么做?

1 个答案:

答案 0 :(得分:0)

通常最好使用某种专用的日志解析软件来完成这类任务,这样你就不必做你想做的事情了。它也绝对不是正则表达式的工作。但是,如果必须使用grep等文本处理工具执行此操作,我建议采用两阶段方法:

  1. 生成您要查找的每个时间戳的列表。
  2. 使用grep -F查找日志中包含其中一个时间戳的所有行。
  3. 例如,如果您只想找到文件的中间五行(带有时间戳[04/Aug/2016:19:00:00 +0200]的那一行),这将使第1步非常简单(因为您生成单项列表,只有一个时间戳)。

    echo '[04/Aug/2016:19:00:00 +0200]' > interesting_times
    

    然后查找具有该时间戳的所有行:

    grep -F -f interesting_times logfile
    

    您可以通过降低时间戳的精度来生成更短的列表。例如,要找到两整个小时的日志数据:

    echo '[04/Aug/2016:19' > interesting_times
    echo '[04/Aug/2016:20' >> interesting_times
    

    我留给你确定如何生成有趣时间列表,但要认真研究专门构建的日志解析软件。