linux日志分析之抓取指定列并按多字段排序

本文介绍如何使用Linux命令行工具,如awk和sort,从固定格式的日志中抓取特定列并进行多字段排序,包括按epc和时间排序的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

部署上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强大了吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值