sh中grep:commond not found解决办法

上次在处理生产事故的时候要从日志中找出失败和可能失败的记录,给这些用户重新请求,顺道温故了一下shell。


先确定下分析思路,在请求正常的情况下每个uid会记录5次日志,此次失败的uid只有一次日志记录,那么我要做的就是先筛出所有的uid,然后再去日志里找记录次数小于4次的uid

  • 分析日志,确定需要提取哪句日志,分析后需要找出包含关键字”&uid=”的日志记录

1
$ grep "&uid=" info.log > temp.log

然后temp.log里就是我们需要分析的日志,日志每行都很长,不一定都是我们需要的信息,比如类名,时间,其他无关参数等等

  • 精简一下日志

1
2
$ vim temp.log
$ :% s/xxxx//g

其中xxxx是要替换的内容,%为全量操作,不加的话只操作光标行
这个时候已经得到非常精简的日志记录了,但我们的目的是更精简的—-只要uid就好,剩下的每行记录都会有差异,不好批量操作,但每行数据的排列又是有规律的,这时候我把数据down到本地,在excel里面分列一下数据,就直接得到了每行只有uid的记录。
找到这些记录呢,就要写脚本来循环temp.log中每行的uid来去info.log中筛选次数不够的记录

  • 循环读取筛选

之后就出现文章标题的问题了,先贴上测试的脚本:

1
2
3
4
5
6
7
8
#! /bin/sh
count='grep uid=xxx info.log|wc -l'
if [$count -gt 4]
then
echo "uid=0 is OK"
else
echo "uid=0 is have no coupon"
fi

警察蜀黍就是这个人!使尽浑身解数,摆完各种姿势,就是报[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