虽然使用linux也有好几年了,但是服务器端开发的活儿正经来算才干不到一年。
一直没有需求和机会会去花大量的时间排查日志啥的,直到我摊上了大事t t,写的代码在线上出了bug需要排查问题。
grep可能是这两天我使用得最多的命令了,下面是grep的一些基本用法。
grep [-acinv] [--color=auto] [-A n] [-B n] '搜寻字符串' 文件名参数说明:-a:将二进制文档以文本方式处理-c:显示匹配次数-i:忽略大小写差异-n:在行首显示行号-A:After的意思,显示匹配字符串后n行的数据-B:before的意思,显示匹配字符串前n行的数据-v:显示没有匹配行-A:After的意思,显示匹配部分之后n行-B:before的意思,显示匹配部分之前n行--color:以特定颜色高亮显示匹配关键字 一般我们很容易写出这样的语句。
grep '123' test.txt
这表示我们需要从test.txt这个文件中查找'123'这个字符串。同时将返回匹配到的整行数据。
那么通常我的匹配需求里面,动不动就是要把某一段数据拿出来。例如
2016-04-26T20:13:09.012934+08:00 ERROR ip[107309309] /logistics/123[-]: { "tid":"20160425-177561416","company_name":"其他","out_sid":"123124123C16042600320"} -------> 2001 该订单不允许设置物流:2016-04-26T21:08:22.172071+08:00 ERROR ip[107309309] /logistics/123[-]: { "tid":"20160425-177560652","company_name":"其他","out_sid":"1231231C16042504184"} -------> 2001 该订单不允许设置物流:2016-04-26T21:08:24.293799+08:00 ERROR ip[107309309] /logistics/123[-]: { "tid":"20160425-177560652","company_name":"其他","out_sid":"13123C16042504184"} -------> 2001 该订单不允许设置物流:2016-04-26T21:48:42.676001+08:00 ERROR ip[107309309] /logistics/123[-]: { "tid":"20160417-177400674","company_name":"其他","out_sid":"1231C16041702542"} -------> 2001 该订单不允许设置物流:2016-04-26T21:48:44.528692+08:00 ERROR ip[107309309] /logistics/123[-]: { "tid":"20160417-177400674","company_name":"其他","out_sid":"1221C16041702542"} -------> 2001 该订单不允许设置物流:
我只需要得到里面tid后面的一长串订单号数据。就需要使用到前面 介绍到的-o 这个option。这个option的作用是只会将匹配到的部分返回给我们
grep '/logistics/123' err.log-20160427 | grep -o '\"2016.\{14\}'
这里我先抓到符合条件的缩小了范围,然后使用管道继续抓去更精确的数据。利用这个方法我们可以逐渐使用管道缩小抓取的范围。如果你觉得一次性拼一个正则表达式有点难度,那么就利用管道符逐渐缩小范围,直到抓取到想要的数据。 例如我这里还想要计算抓到的条数可以用两种选择
grep -c '/logistics/send' err.log-20160427 | grep -o '\"2016.\{14\}'grep '/logistics/send' err.log-20160427 | grep -o '\"2016.\{14\}' | wc -l
一个是使用grep自带参数。第二个是直接利用管道符然后用wc -l来计算有多少行,非常灵活。
还有更多的灵活用法,可以多用用自然就熟悉该怎么写了。