如何使用grep 等命令快速的在日志中找到自己需要的内容

虽然使用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来计算有多少行,非常灵活。

还有更多的灵活用法,可以多用用自然就熟悉该怎么写了。

原文地址:https://www.cnblogs.com/piperck/p/5440516.html