如何使用bash脚本捕获运行日志?

我是bash脚本的新手。 有一些我想知道使用bash脚本捕获日志文件

比方说,有一台服务器每小时存储日志文件格式文件如下。

file[20160509_130000].log 

日志文件有这样的详细信息。

 13:00:00 INFO [file.chdev130] Event: ADIEVN_PLAY_DONE, Finished , nbytes=16360 13:00:00 INFO [file.chdev39] adiCollectDigits() success 

我的问题是我如何读取和存储运行日志或一小时之前获取特定的参数(例如“事件”)到新文件使用bash脚本?

有人可以教我如何做到这一点? 谢谢。

更新这里我想要的stream程(这一次我想知道第一点如何工作):

  1. 获取运行日志或一小时前。
  2. 阅读15分钟的时间间隔(13:00:00 – 13:15:00)。
  3. grep参数(例如“Event”)。
  4. 计数参数。
  5. 将其存储到另一个文件。

解决了

这里的解决scheme,以防有人需要它。

  1. 使用ls -t列出所有基于时间戳的内容,然后pipe理它
  2. 使用grep -v ^d (我仍然不知道^ d的确切解释),再次使用pipe
  3. 头几行显示

所以结果是,

 ls -t *.log | grep -v ^d | head -1 (for display the running log) ls -t *.log | grep -v ^d | head -2 | tail -1 (for display the one log before the running log) 

希望它会有所帮助。 谢谢

==案例closures==

tail -f /path-to-logfile将允许您不断读取文件,直到您取消tail执行。
grep "^13:" /path-to-logfile会显示grep "^13:" /path-to-logfile所有字符串,从“13:”开始,在我们的例子中,你会得到每个记录13个小时。
grep "Event" /path-to-logfile会向你显示所有带有“Event”的字符串,我想你已经有了关于grep的想法。 )

您可以使用日志文件名称约定使用date来计算当前日志文件或以前的日志文件名:

 fname="file[`date -v-1H '+%Y%m%d_%H0000'`].log" 

会给你以前的文件名。 省略-v-1H获得当前的一个。

对于15分钟的时间间隔,您可以在00:00-14:59间隔内使用'^\d\d:(0\d|1[0-4])'表达式, '^\d\d:(1[5-9]|2\d)'例如,在第一个正则表达式中, ^匹配行首, \d\d:匹配“两个数字和a (0\d|1[0-4])与任何相邻的数字匹配,或者与从0到4的相邻数字匹配。在第二个正则表达式中, (1[5-9]|2\d)与从5到9的数字匹配1,或与任何数字2匹配。

然后,假设事件的类型总是以a ,结尾, grep -Po '(?<=Event: ).+(?=,)'为日志中事件的类型。 这个正则表达式会贪婪地匹配任何符号,尽可能多地从一个符号开始,如果他们之间的字符串Event:,Event:,自己不匹配,这是看起来后/ lookaheads)。 然后使用sort | uniq -c sort | uniq -c来统计不同事件条目的个数。

所以得到的脚本看起来像

 fname="file[`date -v-1H '+%Y%m%d_%H0000'`].log" grep -P '^\d\d:(0\d|1[0-4])' "$fname" | grep -Po '(?<=Event: ).+(?=,)' | sort | uniq -c > "/tmp/$fname_00-14" # entries for first 15 minutes grep -P '^\d\d:(1[5-9]|2\d)' "$fname" | grep -Po '(?<=Event: ).+(?=,)' | sort | uniq -c > "/tmp/$fname_15-29" # entries for second 15 minutes grep -P '^\d\d:(3\d|4[0-4])' "$fname" | grep -Po '(?<=Event: ).+(?=,)' | sort | uniq -c > "/tmp/$fname_30-44" # entries for third 15 minutes grep -P '^\d\d:(4[5-9]|5\d)' "$fname" | grep -Po '(?<=Event: ).+(?=,)' | sort | uniq -c > "/tmp/$fname_45-59" # entries for fourth 15 minutes 

在最后一个小时登录。

另一种方法是使用logtail和cron条目来获取最后的日志条目,而不是grepping。 您可以将脚本设置为每小时00,15,30和45分钟由cron运行,确定其中的日志文件名并像logtail -f "$fname"一样记录文件。 这里的问题是,当在00分钟运行时,你需要使用-v-1H开关作为日期,这种方法并不像时间精确。