起因
今天遇到一个问题需要查看业务日志,场景大概是这样的,每个次请求都会产生多行业务日志,第一行日志记录了请求参数uid,每行业务日志都会有一个traceid。我们先需要根据某个人的uid去查找他的所有请求的业务日志。
例如:
2020/05/26 23:26:40.041 [I] [xxx.go:34] br6jac5jeehi2459hk0g RequestParam: {"uid":213123123}
2020/05/26 23:26:40.126 [I] [bbb.go:53] asdasdasdasdasdasdas Response CostTime: 84.806814ms
2020/05/26 23:26:40.041 [I] [ccc.go:34] sdfasdfasdfasfasdfas RequestParam: {"uid":123123}
2020/05/26 23:26:40.041 [I] [sss.go:61] br6jac5jeehi2459hk00 Abtest Api:
2020/05/26 23:26:40.043 [I] [fff.go:84] br6jac5jeehi2459hk00 Abtest Resp: {}
第5列是traceid
逻辑顺序就是grep取出这个人的uid的所有traceid,在把所有的有相关traceid的行都取出
开始操作:
方法1:
作为一个awk小能手,没有啥是awk不能搞定的
grep '213123123' /info.log |awk '{b=system("grep --color "$5" /info.log");print b}'
结果可行,唯一的遗憾是system函数会把执行命令的结果也返回,于是多了一串串奇怪的0,1,0,1,强迫症受不了。
方法2
管道配合xargs加-i参数,意思为将前一个管道输出的每一行做为参数替换到{}所在的位置,问题完美解决。
grep '213123123' /info.log |awk '{print $5}'|xargs -i grep {} test.txt
如果你不想用{}作为替换占位符,-I可以指定占位符,所以以上也可以这样写
//指定!作为占位符
grep '213123123' /info.log |awk '{print $5}'|xargs -I ! grep ! test.txt
但是在mac中不支持-i,只支持-I
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。