从文本中提取并整理目标数据(利用grep awk工具)

问题

有时,我们需要从日志文件中提取目标数据,并对数据进行一定的整理。
比如,有这样一个场景:你拿到一个监控模块的日志文件,这个文件包含监控模块一段时间内记录的各模块健康状态、cpu占用率、内存占用率、GPU使用情况、IO流量以及其它许多杂乱的数据;现在,你关注各进程的CPU占用率、内存占用率的峰值。

分析

解决这个问题有很多种办法,比如用python等高级语言处理、先用文本工具过滤后人工处理等;不过这有一些缺点:

  • 用python等语言处理,显得太重了
  • 文本工具过滤后人工处理:如果是每天都需要统计一次,那就太费时费力了

更切合的方式是用linux的grep、awk等文件处理工具处理;本文通过一个例子讲述如何组合使用这些工具。

样例

待处理文件

[INFO] [1530267183.720205]: 
--test data
--- Monitor rosnode debug data
Sun Jul  1 15:36:09 CST 2018 
--test data
[INFO] [1530267183.720490]: Pid: 61006 name: /xk/perception/task_model                 threads: 77 cpu: 1.062000 mem: 0.059000 gpu: 0.115500
[INFO] [1530267183.720734]: Pid: 60645 name: /xk/sensors/camera/front/zed_wrapper      threads: 6 cpu: 0.812000 mem: 0.010000 gpu: 0.017100
[INFO] [1530267183.720964]: Pid: 60679 name: /xk/fusion_sender                         threads: 30 cpu: 0.875000 mem: 0.005000 gpu: 0.000000
[INFO] [1530267183.721185]: Pid: 60931 name: /xk/localization/loc_map_matching         threads: 2 cpu: 0.688000 mem: 0.009000 gpu: 0.000000
[INFO] [1530267183.721415]: Pid: 60691 name: /xk/fusion_recorder                       threads: 24 cpu: 0.625000 mem: 0.010000 gpu: 0.000000
[ERROR] [1530267183.719720]: MQTT_SERVICE_PS error: timeout exceeded while waiting for service /asp/mqtt_service_ps
 --- Monitor rosnode debug data
Sun Jul  1 15:36:09 CST 2018 
--test data
--test data
[INFO] [1530267183.720205]: 
--test data
--test data
[INFO] [1530267183.720490]: Pid: 61006 name: /xk/perception/task_model                 threads: 77 cpu: 0.562000 mem: 0.059000 gpu: 0.115500
[INFO] [1530267183.720734]: Pid: 60645 name: /xk/sensors/camera/front/zed_wrapper      threads: 6 cpu: 0.812000 mem: 0.0230000 gpu: 0.017100
[INFO] [1530267183.720964]: Pid: 60679 name: /xk/fusion_sender                         threads: 30 cpu: 1.275000 mem: 0.015000 gpu: 0.000000
[INFO] [1530267183.721185]: Pid: 60931 name: /xk/localization/loc_map_matching         threads: 2 cpu: 0.688000 mem: 0.009000 gpu: 0.000000
[INFO] [1530267183.721415]: Pid: 60691 name: /xk/fusion_recorder                       threads: 24 cpu: 0.625000 mem: 0.010000 gpu: 0.000000
[ERROR] [1530267183.719720]: MQTT_SERVICE_PS error: timeout exceeded while waiting for service /asp/mqtt_service_ps
--- Monitor rosnode debug data
--test data
--test data
Sun Jul  1 15:36:09 CST 2018 
[INFO] [1530267183.720490]: Pid: 61006 name: /xk/perception/task_model                 threads: 77 cpu: 0.562000 mem: 0.059000 gpu: 0.115500
[INFO] [1530267183.720734]: Pid: 60645 name: /xk/sensors/camera/front/zed_wrapper      threads: 6 cpu: 0.812000 mem: 0.010000 gpu: 0.017100
[INFO] [1530267183.720964]: Pid: 60679 name: /xk/fusion_sender                         threads: 30 cpu: 0.875000 mem: 0.005000 gpu: 0.000000
[INFO] [1530267183.721185]: Pid: 60931 name: /xk/localization/loc_map_matching         threads: 2 cpu: 1.288000 mem: 0.009000 gpu: 0.000000
[INFO] [1530267183.721415]: Pid: 60691 name: /xk/fusion_recorder                       threads: 24 cpu: 0.625000 mem: 0.050000 gpu: 0.100000
[ERROR] [1530267183.719720]: MQTT_SERVICE_PS error: timeout exceeded while waiting for service /asp/mqtt_service_ps

目标

获取各个进程的线程数、CPU占用率、内存占用率、GPU占用率峰值
比如: /xk/localization/loc_map_matching、/xk/fusion_sender进程的CPU占用率峰值分别是1.288、1.275

基本思路

  • 通过grep 工具过滤出目标行,再通过awk 获取目标字段,再通过awk 获取峰值
  • 代码如下:
# 假设日志文件保存在log.txt 中
cat log0701.txt | \
grep -E '^\[INFO\].*threads: [0-9]{1,2} cpu: [0,1]{1}\.[0-9]{6} mem: [0,1]{1}\.[0-9]{6} gpu: [0,1]{1}\.[0-9]{6}' | \
awk -F "[:]" '{print $4,$5,$6,$7,$8}' | awk -F ' ' '{print $1,$3,$5,$7,$9}' | \
awk -F ' ' '{ {thread[$1]=(thread[$1]>=$2)?thread[$1]:$2;} {cpu[$1]=(cpu[$1]>=$3)?cpu[$1]:$3;} {mem[$1]=(mem[$1]>=$4)?mem[$1]:$4;} {gpu[$1]=(gpu[$1]>=$5)?gpu[$1]:$5;} } END{ for (key in thread){printf("%-50s:    %-10d%-10.3f%-10.3f%-10.3f\n",key,thread[key],cpu[key],mem[key],gpu[key])}}' | \
sort  -k4nr -k5nr -k6nr -k3nr

输出如下:

nodename                                          :    thread    cpu(%)    mem(MB)   gpu       
/xk/localization/loc_map_matching                 :    2         1.288     0.009     0.000     
/xk/fusion_sender                                 :    30        1.275     0.015     0.000     
/xk/perception/task_model                         :    77        1.062     0.059     0.116     
/xk/sensors/camera/front/zed_wrapper              :    6         0.812     0.010     0.017     
/xk/fusion_recorder                               :    24        0.625     0.050     0.100 

解释如下:
* 命令1printf :打印顶行,即列名
* 命令2cat log0701.txt : 获取文件内容,并以管道的形式输送给下一个条命令
* 命令3grep : 通过正则表达式获取目标行
* 命令4第一个awk : 获取目标字段-预处理阶段
* 命令5第二个awk : 获取目标字段
* 命令6第三个awk : 对所有行进行处理,获得峰值(注:需要了解awk的语法)
* 命令7sort : 根据列排序,优先以第四列排序,次之以第5列排序,等等

总结:

对于文本处理,可以遵循这样的方法:对于文本处理,无规律的文本先通过grep工具过滤出有规律的内容,接着用awk、sed工具对有规律的行进行逐行处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值