前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >日更系列:写一个简单的shell脚本,看起来却有技术含量

日更系列:写一个简单的shell脚本,看起来却有技术含量

原创
作者头像
mariolu
发布2021-10-17 00:32:16
5890
发布2021-10-17 00:32:16
举报
文章被收录于专栏:CDN及云技术分享

一、一致性比较:

最近在重构算法的rerank模块。基本上把代码都重写了。重构的第一要义是构建测试工具,也就是每改一行代码,都要跑下整个测试用例集。对于重构,就是保证业务逻辑和之前的一致,用同样的输入流量(这里是对广告app的打分),经过rarank服务,输出要达到一致性。当然这股流量是用真实的线上旁路出来的流量。这样我们跑几个小时,从几万个请求中保证数据完全一致。

二、准备工作

我们会把关心的数据落下磁盘。每个请求关心的就三个要素:广告app id,CTR分数,CVR分数。这里使用一个请求一个文件。一个请求这样就有4个文件,分别是:改造前模块的请求和响应,改造后模块的请求和响应。当然为了做细致信息排除,还会落下一个完整的请求json,这个请求json包含了很多内部信息:广告出价模式,价格,创意id等。这主要是为了数据分析用,分析不一致的原因。

三、开始脚本之旅

3.1 枚举不一致的请求

落下的文件类似这样,一个请求id有5份文件。这个目录存储了几万个请求的文件。

目标是对同一个请求id的不同文件做两两比较。这里用到的比对工具是icdiff。icdiff是github开源项目,比GNU自带的那个diff更人性化。这里不是本文重点,先跳过去了。

首先需要根据文件名生成icdiff命令。一行命令针对一个请求id做icdiff。

3.1.1 生成请求文件的md5

这里用了常规的find命令,枚举文件夹的所有文件,并且使用xargs工具,把文件名作为输入参数传递至md5sum做一致性比较。

代码语言:javascript
复制
find /tmp/consistent-check/ -type f | xargs -n 1 md5sum > /tmp/check_consistent.result

每个文件都带有md5sum。

3.1.2 接着过滤新旧模块的请求

这里使用了常规的grep和sort进行过滤和排序。

3.1.3 使用icdiff进行对比

这样很容易看出哪些请求id不一致

3.1.4 下一步的预处理

在进行下一步之前,还需要做一些预处理,从这里输出的图片可以看到,里面包含了颜色,还有---符合,这些我们都要去掉。

谷歌搜索了下靠谱的去除 非打印显示字符的方法。https://stackoverflow.com/questions/3844311/how-do-i-replace-or-find-non-printable-characters-in-vim-regex。

代码语言:javascript
复制
 sed 's/[^[:print:]\r\t]//g'

细查一下,有没有多余的字符,如果有,继续用sed处理下。

3.1.5 不一致的数据统计

因为不一致的请求id数据如果比较多。那么首先我们得分析下,对这些不一致的请求做分类。

从不一样的大小多少来分。比如说一个请求id的几行出现了不一致。

但是因为文件很多,我们不可能每次每个都去手动打印一下。

然后就自然了用了for loop语句,我这里使用的是fish shell,如果是bash shell应该有类似的。

代码语言:javascript
复制
set LINE (wc -l /tmp/check_consistent.result.compare.stage8 | awk '{print $1}')
for i in (seq $LINE);echo "handle single req file";end;

然后我们把之前整理好的命令依次从文件读取出来,依次执行。

读某个具体第几行文件该怎么写呢,最常用的比如sed, awk

这里告诉了几个办法。

https://linuxhandbook.com/display-specific-lines/ 之前我用的是sed,但是发现sed读取for里面闯进来的idnex值,解析不了,后面使用awk这个命令 是ok的

代码语言:shell
复制
for i in (seq $LINE);awk "NR==$i" /tmp/check_consistent.result.compare.stage8;awk "NR==$i" /tmp/check_consistent.result.compare.stage8 | bash | grep -v "\-\-\-" | wc -l;end

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、一致性比较:
  • 二、准备工作
  • 三、开始脚本之旅
    • 3.1 枚举不一致的请求
      • 3.1.1 生成请求文件的md5
      • 3.1.2 接着过滤新旧模块的请求
      • 3.1.3 使用icdiff进行对比
      • 3.1.4 下一步的预处理
      • 3.1.5 不一致的数据统计
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档