部署上linux上的app,输出的固定格式的日志,如何抓取指定列并按多字段排序呢?
下面我们以一个具体的日志分析来演示一下。
执行sudo cat logs/reader.log.2019-11-10 |grep "deviceNo="后,输入的内容如下
[2019/11/10 23:21:06 GMT] [App] [INFO] (gitee.com/jerry_zheng/rbuhfstation/southbound.Send:48) deviceNo=100003,epc=JQ0001467,direction=RIGHT2LEFT,rssi=-77
[2019/11/10 23:21:37 GMT] [App] [INFO] (gitee.com/jerry_zheng/rbuhfstation/southbound.Send:48) deviceNo=100001,epc=JQ0000815,direction=LEFT2RIGHT,rssi=0
[2019/11/10 23:23:30 GMT] [App] [INFO] (gitee.com/jerry_zheng/rbuhfstation/southbound.Send:48) deviceNo=100003,epc=JQ0001467,direction=LEFT2RIGHT,rssi=0
[2019/11/10 23:23:38 GMT] [App] [INFO] (gitee.com/jerry_zheng/rbuhfstation/southbound.Send:48) deviceNo=100003,epc=JQ0001467,direction=RIGHT2LEFT,rssi=-74
[2019/11/10 23:23:57 GMT] [App] [INFO] (gitee.com/jerry_zheng/rbuhfstation/southbound.Send:48) deviceNo=100001,epc=JQ0000979,direction=RIGHT2LEFT,rssi=-72
[2019/11/10 23:24:30 GMT] [App] [INFO] (gitee.com/jerry_zheng/rbuhfstation/southbound.Send:48) deviceNo=100003,epc=JQ0001467,direction=LEFT2RIGHT,rssi=0
[2019/11/10 23:27:39 GMT] [App] [INFO] (gitee.com/jerry_zheng/rbuhfstation/southbound.Send:48) deviceNo=100003,epc=JQ0001599,direction=RIGHT2LEFT,rssi=-72
[2019/11/10 23:36:44 GMT] [App] [INFO] (gitee.com/jerry_zheng/rbuhfstation/southbound.Send:48) deviceNo=100004,epc=JQ0000544,direction=LEFT2RIGHT,rssi=0
[2019/11/10 23:39:25 GMT] [App] [INFO] (gitee.com/jerry_zheng/rbuhfstation/southbound.Send:48) deviceNo=100004,epc=JQ0001461,direction=RIGHT2LEFT,rssi=-49
[2019/11/10 23:40:41 GMT] [App] [INFO] (gitee.com/jerry_zheng/rbuhfstation/southbound.Send:48) deviceNo=100002,epc=JQ0000407,direction=LEFT2RIGHT,rssi=0
[2019/11/10 23:42:50 GMT] [App] [INFO] (gitee.com/jerry_zheng/rbuhfstation/southbound.Send:48) deviceNo=100002,epc=JQ0000864,direction=RIGHT2LEFT,rssi=-71
[2019/11/10 23:44:39 GMT] [App] [INFO] (gitee.com/jerry_zheng/rbuhfstation/southbound.Send:48) deviceNo=100003,epc=JQ0001599,direction=LEFT2RIGHT,rssi=0
[2019/11/10 23:48:44 GMT] [App] [INFO] (gitee.com/jerry_zheng/rbuhfstation/southbound.Send:48) deviceNo=100001,epc=JQ0000979,direction=LEFT2RIGHT,rssi=0
[2019/11/10 23:50:51 GMT] [App] [INFO] (gitee.com/jerry_zheng/rbuhfstation/southbound.Send:48) deviceNo=100001,epc=JQ0000975,direction=RIGHT2LEFT,rssi=-56
我们的目标是:
输出时间列、deviceNo、epc、direction、rssi五列,并先按epc、再按日期时间排序
实施步骤:
1. 提取上述日志行需要的字段,时间列、deviceNo、epc、direction、rssi
输入指令如下
sudo cat logs/reader.log.2019-11-10 |grep "deviceNo=" |awk '{print $2,$7}'
注意:因为默认是按照空格分隔的,所以执行要取第二列(时间列)以及最后一列(deviceNo=...,rssi=...整个字符串作为最后一列)。用强大的awk就可以很容易抓取
执行结果如下:
23:07:37 deviceNo=100004,epc=JQ0000187,direction=LEFT2RIGHT,rssi=0
23:10:20 deviceNo=100004,epc=JQ0000544,direction=RIGHT2LEFT,rssi=-62
23:10:43 deviceNo=100003,epc=JQ0001467,direction=LEFT2RIGHT,rssi=0
23:11:33 deviceNo=100003,epc=JQ0001467,direction=RIGHT2LEFT,rssi=-75
23:11:41 deviceNo=100003,epc=JQ0001467,direction=LEFT2RIGHT,rssi=0
23:13:11 deviceNo=100003,epc=JQ0001467,direction=RIGHT2LEFT,rssi=-75
23:18:31 deviceNo=100003,epc=JQ0001467,direction=LEFT2RIGHT,rssi=0
23:18:52 deviceNo=100003,epc=JQ0001467,direction=RIGHT2LEFT,rssi=-80
23:19:33 deviceNo=100003,epc=JQ0001467,direction=LEFT2RIGHT,rssi=0
23:20:05 deviceNo=100003,epc=JQ0001467,direction=RIGHT2LEFT,rssi=-78
23:20:25 deviceNo=100003,epc=JQ0001467,direction=LEFT2RIGHT,rssi=0
23:20:48 deviceNo=100003,epc=JQ0001467,direction=RIGHT2LEFT,rssi=-77
23:20:54 deviceNo=100003,epc=JQ0001467,direction=LEFT2RIGHT,rssi=0
23:21:06 deviceNo=100003,epc=JQ0001467,direction=RIGHT2LEFT,rssi=-77
23:21:37 deviceNo=100001,epc=JQ0000815,direction=LEFT2RIGHT,rssi=0
23:23:30 deviceNo=100003,epc=JQ0001467,direction=LEFT2RIGHT,rssi=0
23:23:38 deviceNo=100003,epc=JQ0001467,direction=RIGHT2LEFT,rssi=-74
23:23:57 deviceNo=100001,epc=JQ0000979,direction=RIGHT2LEFT,rssi=-72
23:24:30 deviceNo=100003,epc=JQ0001467,direction=LEFT2RIGHT,rssi=0
23:27:39 deviceNo=100003,epc=JQ0001599,direction=RIGHT2LEFT,rssi=-72
23:36:44 deviceNo=100004,epc=JQ0000544,direction=LEFT2RIGHT,rssi=0
23:39:25 deviceNo=100004,epc=JQ0001461,direction=RIGHT2LEFT,rssi=-49
23:40:41 deviceNo=100002,epc=JQ0000407,direction=LEFT2RIGHT,rssi=0
23:42:50 deviceNo=100002,epc=JQ0000864,direction=RIGHT2LEFT,rssi=-71
23:44:39 deviceNo=100003,epc=JQ0001599,direction=LEFT2RIGHT,rssi=0
23:48:44 deviceNo=100001,epc=JQ0000979,direction=LEFT2RIGHT,rssi=0
23:50:51 deviceNo=100001,epc=JQ0000975,direction=RIGHT2LEFT,rssi=-56
2. 按epc及时间排序
这时候,强大的sort就派上用场了。用sort指令,指定两个控制参数,-t 指定字符分隔符,我们继续用空格,-k指定排序的列
sudo cat logs/reader.log.2019-11-10 |grep "deviceNo=" |awk '{print $2,$7}' |sort -t ' ' -k 2.21,2.29 -k 1,1
-k参数解释:
2.1 出现两个-k表示按2个字段排序。如果需要按更多的字段排序,可以用多个-k
2.2 第一个-k 2.21,2,29 表示按第二个字段的第21个字符到29个字符(正好是epc的值,JQXXXXXXX)排序
2.3 第二个-k 1,1 表示按第一个字段(整个字段)排序
执行结果如下:
19:14:37 deviceNo=100003,epc=JQ0001588,direction=LEFT2RIGHT,rssi=0
19:14:43 deviceNo=100003,epc=JQ0001588,direction=RIGHT2LEFT,rssi=-73
19:14:56 deviceNo=100003,epc=JQ0001588,direction=LEFT2RIGHT,rssi=0
07:07:27 deviceNo=100003,epc=JQ0001599,direction=RIGHT2LEFT,rssi=-73
07:31:16 deviceNo=100003,epc=JQ0001599,direction=LEFT2RIGHT,rssi=0
16:15:02 deviceNo=100003,epc=JQ0001599,direction=RIGHT2LEFT,rssi=-75
16:16:36 deviceNo=100003,epc=JQ0001599,direction=LEFT2RIGHT,rssi=0
16:19:03 deviceNo=100003,epc=JQ0001599,direction=RIGHT2LEFT,rssi=-77
16:19:08 deviceNo=100003,epc=JQ0001599,direction=LEFT2RIGHT,rssi=0
16:19:41 deviceNo=100003,epc=JQ0001599,direction=RIGHT2LEFT,rssi=-77
16:36:55 deviceNo=100003,epc=JQ0001599,direction=LEFT2RIGHT,rssi=0
23:27:39 deviceNo=100003,epc=JQ0001599,direction=RIGHT2LEFT,rssi=-72
23:44:39 deviceNo=100003,epc=JQ0001599,direction=LEFT2RIGHT,rssi=0
01:58:18 deviceNo=100004,epc=JQ0001607,direction=RIGHT2LEFT,rssi=-51
02:23:23 deviceNo=100004,epc=JQ0001607,direction=LEFT2RIGHT,rssi=0
12:27:32 deviceNo=100004,epc=JQ0001607,direction=RIGHT2LEFT,rssi=-52
12:56:17 deviceNo=100004,epc=JQ0001607,direction=LEFT2RIGHT,rssi=0
15:17:59 deviceNo=100003,epc=JQ0001609,direction=RIGHT2LEFT,rssi=-65
15:47:43 deviceNo=100003,epc=JQ0001609,direction=LEFT2RIGHT,rssi=0
16:31:37 deviceNo=100002,epc=JQ0001617,direction=RIGHT2LEFT,rssi=-63
17:08:33 deviceNo=100002,epc=JQ0001617,direction=LEFT2RIGHT,rssi=0
15:37:26 deviceNo=100002,epc=JQ0001618,direction=RIGHT2LEFT,rssi=-55
16:04:56 deviceNo=100002,epc=JQ0001618,direction=LEFT2RIGHT,rssi=0
15:21:23 deviceNo=100001,epc=JQ0001623,direction=RIGHT2LEFT,rssi=-66
15:50:56 deviceNo=100001,epc=JQ0001623,direction=LEFT2RIGHT,rssi=0
从输出结果看,达到了我们期望的目标:先按标签排序、再按时间排序。
体会到了awk及sort强大了吧!