一句话脚本系列之logcat过滤指定进程的log

欢迎转载!转载时请注明出处:http://blog.csdn.net/nfer_zhuang/article/details/44701657

引言

使用场景:

我在平时的工作中偶尔需要开发或者调试一下apk,重点是放在应用的logcat输出上,但是又由于非常不愿意打开ADT这个吃内存大户,那么我就选择了直接在串口下输入logcat并结合grep过滤出需要调试的进程的所有log。这里面有一个关键处是:在调试过程中需要多次杀掉并重启应用,即该应用的进程id在整个调试过程中并不是一个固定值。

一般用法:

  1. 输入logcat
  2. 查看当前运行的apk进程id
  3. 将该进程id保存到一个临时变量中
  4. 使用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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。