雖然使用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來計算有多少行,非常靈活。
還有更多的靈活用法,可以多用用自然就熟悉該怎么寫了。