如何使用grep查找管道|傳來的字符串

原由

今天遇到一個問題須要查看業務日誌,場景大概是這樣的,每一個次請求都會產生多行業務日誌,第一行日誌記錄了請求參數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的行都取出ui

開始操做:
方法1:

做爲一個awk小能手,沒有啥是awk不能搞定的日誌

grep '213123123' /info.log |awk '{b=system("grep --color "$5" /info.log");print b}'

結果可行,惟一的遺憾是system函數會把執行命令的結果也返回,因而多了一串串奇怪的0,1,0,1,強迫症受不了。code

方法2

管道配合xargs加-i參數,意思爲將前一個管道輸出的每一行作爲參數替換到{}所在的位置,問題完美解決。test

grep '213123123' /info.log |awk '{print $5}'|xargs -i grep {} test.txt

若是你不想用{}做爲替換佔位符,-I能夠指定佔位符,因此以上也能夠這樣寫awk

//指定!做爲佔位符
grep '213123123' /info.log |awk '{print $5}'|xargs -I ! grep ! test.txt

可是在mac中不支持-i,只支持-I請求

相關文章
相關標籤/搜索