经grep日志后得到的数据格式如下:

}
.
[debug][-- ::] SendDataStyled:{
"cmd" : ,
"innings" : "6189269620_0007",
"players" : [
{
"al_board" : ,
"al_win" : ,
"alter_exp" : ,
"alter_money" : ,
"uid" :
},
{
"al_board" : ,
"al_win" : ,
"alter_exp" : ,
"alter_money" : -,
"uid" :
},
{
"al_board" : ,
"al_win" : ,
"alter_exp" : ,
"alter_money" : ,
"uid" :
}
],
"roomid" : "",
"vid" :
}

希望将一条原始数据处理后,生成若干条以下格式的数据:

time al_win alter_money uid roomid

由于很久没有用过awk了,先复习了一遍语法做了些小实验才正式开始。经过整理后的思考路径如下:

  1. 确定分隔符。 原本是想用空格,“[”, “]”,三个符号做分隔的,实验后发现由于打印格式的问题,很多字段前面都有很多个空格,这样不太好数需要的字段编号。所以最后分隔符定为中括号,双引号,冒号,逗号。
  2. 确定所需字段分隔后的编号。 根据分隔符数一下,然后通过命令行验证一下就可以了。这个还是很容易且快的。
  3. 思考如何组织并输出数据。 基本想法是除了要重复用到的time和roomid保存一下,其它字段是拿到后就直接打印,读取uid之后,打印uid及roomid就进行换行。有点困难的是roomid的读取,因为awk是按行顺序处理的,一个uid打印一行数据的话就等不到读后面的roomid了。幸好发现在数据innings里实际上隐含着roomid,拿到innings后用“_”截取前面一段就可以了。
  4. 实操。

整个路径看起来是挺简单的,实际上用了我好几个小时才写出了完整可用的awk。特此记录下遇到的问题及得到教训。

  1. 尽量用awk脚本写,不要在命令行直接写。 也是因为只稍微复习了下语法就开始的原因,不知道可直接写在文件里调用,在命令行写极易出错,不易阅读,而且修改起来相当痛苦。
  2. 自定义变量的生命周期。 不说太深,只说现今用到的。awk我们日常用到的自定义变量基本都是全局变量,直接使用就可以了。只是要注意下自己的程序应当在什么时候对变量进行初始化。如果只初始化一次,就在BEGIN里写;如果需要在具体的行里多次初始化,在BEGIN不用初始化也可以直接用。
  3. 变量的使用。 也是由于复习不到位的问题,没有注意到使用变量时不需要使用$,比如要打印NF变量,直接print NF即可。因为这个小问题,走了不少弯路,深刻的教训。
  4. printf 的随意性。 如果没有定义具体的打印格式,printf后接空格,再接要打印的变量名或字段就可以了,用逗号或空格分隔都可以。要打印的所有变量可以用小括号包起来,也可以不包起来。不得不说,真的是强!
  5. 定义分隔符在命令行和脚本里的不同。 以上文确定的分隔符为例,在命令行应该写作 -F '[][":,]' , 在脚本里则应该在BEGIN里写成 FS="[][\":,]"; 。

最后,贴上写完的脚本:

source.awk

BEGIN {
FS="[][\":,]";
} {
if($~/-/) a=$":"$":"$;
else if($~/innings/) split($, b, "_");
else if($~/al_win/) printf a $;
else if($~/alter_money/) printf $;
else if($~/uid/) printf "%s %s\n", $, b[];
}

直接使用 awk -f source.awk data.log > res.txt 即可。

另附参考的awk基础知识:

https://www.cnblogs.com/xudong-bupt/p/3721210.html

awk处理实记的更多相关文章

  1. Sed 实记 · laoless's Blog

    sed编辑命令 p 打印匹配行 = 打印文件行号 a 在定位行之后追加文本 i 在定位行之前插入文本 d 删除定位行 c 用新文本替换定位文本 s 使用替换模式替换相应模式 r 从另一个文件读取文本 ...

  2. 好不容易帮同事写的一个awk,要记下来

    给昌哥写的过滤的东东. 是实现了,但感觉丑,不规范. 记得下先. 原始数据格式: -- :: [ pool--thread-: ] - [ DEBUG ] origin match ::, user: ...

  3. 实记JLink刷固件方法

    最近J-Link调试程序,不知何故,USB报无法连接,试了别的电脑也是这样.文件存于“百度网盘/05.组装维修/4.单片机/1.JLink-ARM仿真器”下.所有的操作基于WIN7 32位系统. 1. ...

  4. tomcat 优化实记

    好记性不如烂笔头,以下是 tomcat 无脑优化 1.内存设置(VM参数调优)(1). Windows环境下,是tomcat解压版(执行startup.bat启动tomcat)  解决办法:修改“%T ...

  5. asp.net mvc项目实记-开启伪静态-Bundle压缩css,js

    百度这些东西,还是会浪费了一些不必要的时间,记录记录以备后续 一.开启伪静态 如果不在web.config中配置管道开关则伪静态无效 首先在RouteConfig.cs中中注册路由 routes.Ma ...

  6. SpringBoot + SpringCloud学习踩坑实记

     踩的坑: 1).springcloud框架中,依赖一直报错,很可能是没有添加springcloud的依赖,或者是依赖的版本号过低.并且springboot也有一个父依赖. 2.springcloud ...

  7. springboot 完整企业项目搭建实记

    昨天搭建ssm框架时突然想到可以搭建springboot来完美解决配置复杂的问题,今天学习了一下springboot的搭建,在此记录一下搭建的过程和踩过的坑 这里给自己定一个该框架搭建完成的目标,如下 ...

  8. 实记处理mongodb的NUMA问题

    一次在启动mongodb的过程中,出现过NUMA这个问题, mongodb日志显示如下: WARNING: You are running on a NUMA machine. We suggest ...

  9. EJB组件开发实记(1)

    安装JBoss或者Wildfly jdk1.4以上. Eclipes安装插件 JBoss Tools: eclipes Jee photon 在eclipes 内部点击 >>Windows ...

随机推荐

  1. Linux 源码安装nginx

    编译参数详解:https://www.cnblogs.com/houyongchong/p/compileArgs.html 配置参数详解:https://www.cnblogs.com/houyon ...

  2. 物料主数据批导bapi

    创建物料主数据,根据模板不同批导原材料,半成品,成品.可根据实际需求对字段进行增删. report zmmr_bapi_mm01 no standard page HEADING. type-POOL ...

  3. python解压压缩包

    默认解压到当前目录 import shutil shutil.unpack_archive('/root/redis-3.2.3.tar.gz') 解压到home目录下 import shutil s ...

  4. 【转】最新版zookeeper配置看这一篇就够了

    [From]https://blog.csdn.net/yydriver/article/details/81107954 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载 ...

  5. Java 操作Word表格

    本文将对如何在Java程序中操作Word表格作进一步介绍.操作要点包括 如何在Word中创建嵌套表格. 对已有表格添加行或者列 复制已有表格中的指定行或者列 对跨页的表格可设置是否禁止跨页断行 创建表 ...

  6. 抓包分析IP如何设置详细步骤

    首先,要知道的是,我们直接改以太网(校园网)的IP地址是不行的,校园网识别不了 如下图: 我们必须通过让电脑连接个人热点才能完成IP修改. 第一步,连接上热点后打开电脑的cmd命令程序,在命令窗口中输 ...

  7. stack smashing detected解决过程

    在执行程序结束return 0 之后出现上图问题.主要原因是在程序中存在数组越界. 解决方法: 1. 查看定义的结构体内buffer大小,为4096字节 typedef struct { UINT32 ...

  8. C学习笔记-指针

    指针的概念 指针也是一个变量,指针变量的值是另一个变量的地址 换句话说就是,指针存放的是一个内存地址,该地址指向另一块内存空间 指针变量的定义 指向一个变量的变量 int *p = NULL; p = ...

  9. Angular build编译内存溢出"JavaScript heap out of memory"的解决办法

    关于最近使用angular build编译打包的时候,遇到内存溢出的突发情况,做一个简单记录 编译报错如下↓↓↓ 报错信息很直观地指出是内存溢出了.是什么导致了内存溢出呢?其根本原因在于 nodejs ...

  10. sqlalchemy orm的cascade的参数

    #encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,Text ...