将 adb logcat 进行 grep 并将输出写入文本文件。

40
我想要使用grep命令来筛选adb logcat,并将输出写入到文本文件中。 如果我只是做这样:
./adb logcat > std.txt

它将整个日志写入文本文件。如果我这样做:

./adb logcat | grep ABC

它会将所有包含ABC的行打印到我的终端。但现在我希望搜索ABC并仅将这些行写入文本文件。

这样:

./adb logcat | grep ABC > std.txt

不起作用。

正确的命令是什么?


我也遇到了同样的问题。如果我执行 adb logcat | grep ABC,其中包含字符串“XYZ”,然后执行 adb logcat | grep ABC | grep XYZ,我什么也得不到。我确信有输出行既包含“ABD”又包含“XYZ”,为什么会这样呢? - Bjarke Freund-Hansen
哪个主机操作系统,哪个grep工具?例如,在我的OS X上可以使用提供的BSD grep工具。 - laalto
如果您使用Eclipse,您可以使用特殊的“保存”按钮来执行此操作... :P - user1545072
嘿,请检查我的答案。这是一个可行的解决方案! :) - Levente Kurusa
1
感谢所有出色的回答。这很有道理,grep正在缓冲logcat的大量输出,然后才返回它。因此,在管道中grep之后的任何内容,只有在准备好从grep发出更大量的数据时,才会接收到输出。但是通过在grep中进行行缓冲,grep将在管道中向前过滤每一行,并将其作为输出发出。 - Bjarke Freund-Hansen
8个回答

58

我认为grep存在缓冲问题。你可以尝试像这样:

./adb logcat | grep --line-buffered ABC > std.txt

对于链接grep而言,应该是同样的问题。

编辑:类似的问题可以在这里找到:为什么使用两次grep时没有输出?


我不确定在不知道“--line-buffered”之前是如何度过的。这个答案应该得到更多的赞! - Peaker

6

编辑: 这似乎是有效的

 ./adb logcat |grep --line-buffered  ABC >a.txt

我可以为您解释这里发生了什么。希望有人能从中得出一个解决方案。如果您在终端中运行以下命令:
cat |grep "ABC"

当您开始输入文本行时,您会发现 grep 立即输出包含该文本的任何行。

 cat somefile.txt | grep "ABC" 

它会将所有包含“ABC”的行打印到终端,这是预期的。

但如果您运行

cat |grep ABC >a.txt

当你在终端上开始输入文本时,你会发现文件直到输入一个EOF字符(Ctrl+D)并使cat终止后才被写入。

但是使用 --line-buffered 命令可以让输出按照预期方式显示。

cat |grep --line-buffered  ABC >a.txt

5
这对我很有用:
./adb logcat | grep ABC | dd of=/home/levex/dump.txt
解释:./adb logcat打开logcat日志,通过管道传递到grep ABC筛选出包含ABC的行,再通过管道传递到dd of=/home/levex/dump.txt输出到文件中。of=xxx参数设置了输出文件。

3
尝试运行命令:adb logcat | grep ABC | tee out

1

试试这个

./adb logcat -s "ABC" > std.txt

抱歉UdayaLakmal和svnpenn,但这不起作用。它只是将这些行写入文件中: --------- /dev/log/system的开头 --------- /dev/log/main的开头 - AndroidGuy
你是否运行了生成“ABC”字符串的应用程序?我测试了一下,“drriveAPI”字符串的结果如下:adb服务器已过期。正在终止... 守护程序启动成功 ---------开始/dev/log/main ---------开始/dev/log/system D/drriveAPI(27329): http://d.com/tag/abcdef/assign? D/drriveAPI(27329): URLhttp://d.com/tag/abcdef/assign? D/drriveAPI(27329): http://d.com/tag/abcdef/assign? D/drriveAPI(27329): URLhttp://d.com/tag/abcdef/assign? - UdayaLakmal

1

1

可能类似于查找所有包含单词"时间"、"testapk1"和"testapk2"的条目。

adb logcat -v time testapk1 testapk2 *:S -d > adblogfilter.log 

0

试一下这个

adb logcat -d -e "ABC" > std.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接