2016-09-08 23 views
0

所以这里是我的问题:我有很大的日志文件,并希望有一个脚本特定的时期和安全他们用grep到一个文件(排序),基本上HOWTO的grep在与定义的开始和结束日期的月

bash script.sh Jul 4 Sep 30 

将返回例如

Sep 30 user0 logged in 
Sep 15 user1 logged in 
Aug 6 user0 logged in 
Aug 3 user1 logged in 
Jul 28 user2 logged in 
Jul 27 user2 logged in 
Jul 4 user0 logged in 

我第一次尝试是,每一个月份和日期得到他自己的变量一样

bash script.sh Jul 4 Sep 3 0 

这样我就可以使用grep的$ 1开始月(7月),开始日期(4)$ 2等类似

for logs in logs* 
do 
grep -qEe "^\"$1\" [\"$2\"-9]\s" $messages >> result.txt 
done 

从7月4日获得的所有日志到9,但我不知道该怎么从整个时间段得到的日志不是在同一个月,也不是在像1-9或10-19等时期
任何帮助非常感谢!

编辑:

至于有些人问,这是我的日志文件看起来怎么样(只是更大和不排序):

Sep 30 user0 logged in 
Jul 27 user2 logged in 
Aug 6 user0 logged in 
Aug 31 user1 logged in 
Jul 8 user2 logged in 
Sep 5 user1 logged in 
Jul 27 user2 logged in 
Jul 14 user0 logged in 
[...] 
+0

举个例子,给我们几行日志文件。 – redneb

+0

这是Gnu awk中的一个:http://stackoverflow.com/questions/39220666/how-to-get-all-the-logs-with-certain-string-value-in-the-last-a-few-minutes/39221519#39221519 –

+0

日志文件看起来像第二个代码段,只是更多的行(未排序)与其他日期,如7月3日用户0登录或5月15日用户1登录 – Maxir

回答

0

这是我的看法:

#/bin/bash 

year="$(date +"%Y")" 
start="$(date -d"$1 $2, $year" +'%s')" 
end="$(($(date -d"$3 $4, $year" +'%s')+86400))" 
for log in logs*; do 
    while IFS= read -r line; do 
     d="$(date -d"$(cut -d' ' -f1,2 <<< "$line"), $year" +'%s')" 
     if (($start <= $d && $d < $end)); then 
      echo "$s" 
     fi 
    done < "$log" 
done 

你这样运行:./script.sh Jul 04 Sep 03。由于日志中不包含年份,因此它假定所有日期(包括命令行中的日期)均为当年。这可能不是最优化的解决方案,但它的工作原理。它依赖date它重复调用将日期解析为unix时间戳。 unix时间戳很好,因为它们只是数字,因此可用于数字比较。

+0

谢谢,这看起来非常接近我想要的。嗯,但我不明白第5和第6行(d =,我认为这是转换日志中的日期和时间?)能解释它们吗?此外,因为我的日志看起来不同,那么Thu Aug 25 15:19:01 2016 [信息]:xvbdfdre dfdfd(无日期名称,也不是时间和年份):/ – Maxir

+0

如果您没有给出行的示例,我无法帮助您日志。您不明白的代码行,执行字符串操作来提取字符串的日期部分并解析它。 – redneb

+0

日志文件看起来像第二个代码段,只是更多的行(未分类)与其他日期,如7月3日用户0登录或5月15日用户1登录(我编辑我的帖子,以便大家可以看到它) – Maxir

0
$ range="Jul 4 Sep 30" 
$ awk -v range="$range" ' 
BEGIN { 
    numMths = split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",m) 
    for (i in m) { 
     mths[m[i]] = i 
    } 

    split(range,r) 
    beg = sprintf("%02d%02d", mths[r[1]], r[2]) 
    end = sprintf("%02d%02d", mths[r[3]], r[4]) 
} 
{ cur = sprintf("%02d%02d", mths[$1], $2) } 
(cur >= beg) && (cur <= end) { vals[$1,$2] = $0 } 
END { 
    for (mthNr=numMths; mthNr>0; mthNr--) { 
     for (dayNr=31; dayNr>0; dayNr--) { 
      date = m[mthNr] SUBSEP dayNr 
      if (date in vals) { 
       print vals[date] 
      } 
     } 
    } 
} 
' file 
Sep 30 user0 logged in 
Sep 5 user1 logged in 
Aug 31 user1 logged in 
Aug 6 user0 logged in 
Jul 27 user2 logged in 
Jul 14 user0 logged in 
Jul 8 user2 logged in 
相关问题