上次在处理生产事故的时候要从日志中找出失败和可能失败的记录,给这些用户重新请求,顺道温故了一下shell。
先确定下分析思路,在请求正常的情况下每个uid会记录5次日志,此次失败的uid只有一次日志记录,那么我要做的就是先筛出所有的uid,然后再去日志里找记录次数小于4次的uid
1 | $ grep "&uid=" info.log > temp.log |
然后temp.log里就是我们需要分析的日志,日志每行都很长,不一定都是我们需要的信息,比如类名,时间,其他无关参数等等
1 | $ vim temp.log |
其中xxxx是要替换的内容,%为全量操作,不加的话只操作光标行
这个时候已经得到非常精简的日志记录了,但我们的目的是更精简的—-只要uid就好,剩下的每行记录都会有差异,不好批量操作,但每行数据的排列又是有规律的,这时候我把数据down到本地,在excel里面分列一下数据,就直接得到了每行只有uid的记录。
找到这些记录呢,就要写脚本来循环temp.log中每行的uid来去info.log中筛选次数不够的记录
之后就出现文章标题的问题了,先贴上测试的脚本:
1 | #! /bin/sh |
警察蜀黍就是这个人!使尽浑身解数,摆完各种姿势,就是报[grep:commond not found
echo $PATH没问题,换了/bin/grep也不行,引号内语句直接shell里执行没问题
后来斗争了一万次,终于搞定,其实也很简单,把那句换成1
count=$(grep uid=xxx info.log|wc -l)
就好了。。。
我真是。。。哗了狗了!
测试过了后最终脚本如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14#!/bin/sh
while read line
do
UIDERROR=$line
count=$(grep $UIDERROR info.log|wc -l)
if [ $count -gt 4 ]
then
echo "uid=$UIDERROR is OK"
else
echo "uid=$UIDERROR have no coupon,write in file"
echo $line >>patch.log
fi
done < temp.log
这样patch.log里面就是需要重新执行请求的用户uid