歡迎轉載!轉載時請註明出處:http://blog.csdn.net/nfer_zhuang/article/details/44701657
引言
使用場景:
我在平時的工作中偶爾需要開發或者調試一下apk,重點是放在應用的logcat輸出上,但是又由於非常不願意打開ADT這個吃內存大戶,那麼我就選擇了直接在串口下輸入logcat並結合grep過濾出需要調試的進程的所有log。這裏面有一個關鍵處是:在調試過程中需要多次殺掉並重啓應用,即該應用的進程id在整個調試過程中並不是一個固定值。
一般用法:
- 輸入logcat
- 查看當前運行的apk進程id
- 將該進程id保存到一個臨時變量中
- 使用logcat | grep PID過濾出該進程的所有log
一句話腳本用法:
PID=`logcat -d -s XXX | tail -n 1 | sed 's/.*( *\([0-9]*\)).*/\1/'` && logcat -v time | grep --color $PID
上面的腳本分解步驟是:
先輸出指定TAG的logcat
然後截取最後一行(如果是截取第一行,很有可能是上一次進程的log信息)
過濾出其中的進程號
再次輸出log並使用進程號過濾
logcat -d -s XXX說明
-d dump the log and then exit (don't block)
-s Set default filter to silent.
使用-d參數表示只需要dump出現當前的logcat即可,因爲在前兩步中我們的目的是獲取到應用的進程號;而如果不使用-d參數,則使用管道後想要得到最後一行就不可能了。
-s參數是指定應用中的任意一個TAG即可。有人就疑問了,爲什麼不直接使用該TAG進行過濾即可,原因在於:通常一個應用中每個子模塊都會有獨立的TAG以便標識。
tail -n 1說明
-n, --lines=K output the last K lines, instead of the last 10;
tail命令和head命令相反,默認是輸出最後10行內容,我們這裏只需要最後一行即可,過使用-n 1參數.
sed 's/.*( *\([0-9]*\)).*/\1/'說明
先看一下logcat -d -s XXX | tail -n 1後的輸出:
V/XXX ( 238): this is a test log ...
這裏我們使用sed的目的就是取出括號中的進程號部分,這裏有兩種思路來實現:
思路一:將括號中的內容匹配出來(上面一句話腳本中即使用了該方法)
思路二:將括號外的內容刪除(即保留括號內的內容)
兩種方法都不算再複雜,請自行選擇。
logcat -v time | grep --color $PID說明
這部分就簡單了,就是logcat輸出然後在使用grep過濾一下即可,只不過這裏使用了--color參數,實際上就是對grep的結果高亮一下。也算是讓全黑的輸出增加一點色彩。
總結
這個一句話腳本最主要的部分就是使用sed過濾出目標字符串,以及通過臨時變量傳遞數值的方法。
另外寫這篇博客的一個收穫就是我又學到了另外一種思路來過濾出目標內容:
PID=`logcat -d -s P2PLib | tail -n 1 | sed 's/[^)]*( *\|)[^(]*//g'` && logcat -v time | grep --color $PID