分享

按时间段进行日志筛选的三种Shell编写方法

 刀首木 2018-09-19

tips:阅读了本文,你将了解到哪个命令效率最高,哪个命令编写最简单

在日常系统维护、问题排查时,经常需要对系统后台日志进行筛选过滤。如果对特定时间段的日志进行筛选,该如何编写Shell脚本(命令)呢?本文给出三种常用的Shell编写方法:grepgawksed

 

日志筛选需求描述:从20171222日的日志文件中,统计时间段13:30~18:00之间包含筛选词“open.app”的日志行数。

 

本系统后台日志格式如下图所示:

从图中可以看出每行日志以“yyyy-MM-dd HH:mm:ss”开头,故要筛选一段时间的日志,就要匹配该日志的时间前缀。

接下来文章分别介绍使用grepgawksed命令,如何进行相关的Shell脚本(命令)的编写。

  

1grep命令

 

在日志筛选、搜索中,grep是使用频率较高的命令。对于grep命令来说,如果筛选一段时间的日志,需要进行多条件相并过滤,使用正则表达式进行处理。对于13:30~18:00时间段来说,可以转化为下面表格多个时间相并。

序号

筛选条件

筛选时间段

1

2017-12-22 13:3

13:30:00~13:39:59

2

2017-12-22 13:4

13:40:00~13:49:59

3

2017-12-22 13:5

13:50:00~13:59:59

4

2017-12-22 14

14:00:00~14:59:59

5

2017-12-22 15

15:00:00~15:59:59

6

2017-12-22 16

16:00:00~16:59:59

7

2017-12-22 17

17:00:00~17:59:59

命令如下:

grep -E '^2017-12-22  13:3|^2017-12-22 13:4|^2017-12-22 13:5|^2017-12-22 14|^2017-12-22  15|^2017-12-22 16|^2017-12-22 17' 2017-12-22.log.txt | grep  'open.app' | wc -l

运行结果如下图:

共检索筛选到71314条。

上述命令条件可以使用正则表达式进行缩减,命令如下:

grep -E '^2017-12-22  13:[3,4,5]|^2017-12-22 1[4,5,6,7]' 2017-12-22.log.txt | grep  'open.app' | wc -l

运行结果如下图所示:

检索筛选到71314条,和上述命令一致。

  

2gawk命令

 

gawk命令是功能强大、可编程的Linux命令。使用gawk命令筛选一段时间的日志,其思路是首先截取出每行日志的“yyyy-MM-dd HH:mm:ss19位时间前缀,然后将该前缀字符串与“2017-12-22 13:30:00”、“2017-12-22 18:00:00”进行比较,不在该范围的日志则丢弃。

命令脚本如下所示:

cat 2017-12-22.log.txt  | gawk '

{

    time = substr($0, 1, 19);

         if(('2017-12-22 13:30:00' <= time)="" &&=""  (time="">< '2017-12-22="" 18:00:00'))="">

         {

             print($0);

         }

}

' | grep  'open.app' | wc -l

运行结果如下图所示:

共检索筛选到71314条。

注:需要注意“2017-12-22 18:00:00”使用的是小于符号,而不是小于等于符号。

 

3sed命令

 

sed是一种流编辑器命令,它是文本处理中非常中的工具,能够完美的配合正则表达式使用。使用sed命令选定行的范围语法,既是逗号语法。

命令如下所示:

sed -n '/2017-12-22  13:30:00/,/2017-12-22 18:00:00/p' 2017-12-22.log.txt | grep  'open.app' | wc -l

运行结果如下图所示:

共检索筛选到71314条。

注:该sed命令含义是选定行范围:从第一行“2017-12-22 13:30:00”开始,到第一行“2017-12-22 18:00:00”结束,包括第一行“2017-12-22 18:00:00”。如果不筛选“open.app”关键字,单纯计数,则sed命令比如上述grepgawk命令多筛选出一条

  

4命令比较

 

对命令运行时间和命令编写的复杂性进行对比,结果如下表所示:

命令

耗时(秒)

命令复杂性

grep

50

gawk

122

sed

61

从表中可以看出,grep命令运行时间最短gawk命令运行时间最长,而且命令编写较为复杂。另外sed命令运行时间跟grep相近,但是sed命令对时间段适应性较好。如果时间段扩大,grep命令修改较大,而sed命令修改较小。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多