awk 处理日志

提取一段时间内的日志

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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,如果时间戳编一个位置额所有出现的地方都需要修改,针对这种易变地方使用变量做了一层抽象。



awk 处理日志
http://blog.soul11201.com/2015/12/07/awk-处理日志/
作者
soul11201
发布于
2015年12月7日
许可协议