提取一段时间内的日志

[2015-12-07 03:16:49] DataHandlerUtils.Thread-0 - INFO  - 1449429345:12D2300A13CA:0BBA2D85CD31:49:4

在群里一位朋友提出的问题,原先他想用正则提取。看到这个日志格式感觉用awk也能搞定这件事情。更让我感觉awk有戏能完成这件事情,有时候自己也需要类似的功能,顺道写了下面一段awk代码。思路大致是,首先是利用分隔符提取到时间,然后根据时间判断改行打不打印。

awk -F"[ :]" 
'
BEGIN{
    PRINT_INFO=0;
    LINE_NUM = 0
} 

{ 
    CON_VAR = $11;

    if(CON_VAR > 1449459202){ 
        PRINT_INFO = 1;
    }

    if(CON_VAR > 1449459219){
        PRINT_INFO = 0;
    }

    if(PRINT_INFO == 1){
        print CON_VAR," "$0;
        LINE_NUM += 1
    }
}

END{
    print "TOTAL : ",LINE_NUM,"lines."
}
'

PRINT_INFO 的使用 某些行需要显示,某些不要显示,这样就需要一个控制标志,最简单的方式是使用一个变量。其实也是可以不使用这个变量,把 前两个if合并到最后一个if中,这样就可以去掉 PRINT_INFO 这个变量,但是为什么不这样做呢?

  • 首先,这样写让我感觉易读,结构清晰。
  • 其次,如果影响PRINT_INFO值改变的原因改变了呢?这样修改就不必影响第三个if块。另外这种写法只需要关注要修改的if,是1个点。而如果三个合并在一块,没修改1个数字,自己无形中就会去关注的三个点,无形中给自己省了很多精力。

CON_VAR 的使用 一开始没有使用这个变量而是直接使用的$11,如果时间戳编一个位置额所有出现的地方都需要修改,针对这种易变地方使用变量做了一层抽象。