如何在 adb logcat 上使用 grep 和 sed

如何在 adb logcat 上使用 grep 和 sed

我目前正在grep与(android console api)结合使用adb logcat。现在我想使用管道动态编辑每一行sed。但是,在 grep 之后使用 sed 时,输出变为空。有人知道为什么吗?另外:adb logcat 继续与 grep 一起运行,这可能是问题的一部分,但我不知道如何修复它

这是一个例子

$ adb logcat | grep "Average inference"

给我

04-16 13:51:19.528  8065  8065 E tflite  : Average inference timings in us: Warmup: 38350.1, Init: 2158247, Inference: 70339.2Overall max resident set size = 65.7773 MB, total malloc-ed size = 0 MB, in-use allocated/mmapped size = 10.3201 MB  
04-16 13:51:19.528  8065  8065 E tflite  : Average inference timings in us: Warmup: 38350.1, Init: 2158247, Inference: 70339.2Overall max resident set size = 65.7773 MB, total malloc-ed size = 0 MB, in-use allocated/mmapped size = 10.3201 MB  

现在我想用这个管道提取所有数字(“热身”之后)

sed -e 's/^.*Warmup//' -e 's/[^0-9.0-9]/ /g' 

得到以下结果

38350.1 2158247 70339.2 65.7773 0 10.3201
38350.1 2158247 70339.2 65.7773 0 10.3201

然而

adb logcat | grep "Average inference" | sed -e 's/^.*Warmup//' -e 's/[^0-9.0-9]/ /g' 

只给我一个空的输出

更新:

通常,adb logcat 会给我很多任意的输出,我需要抑制这些输出。因此,典型的输出如下

05-04 20:18:00.063  5670  6838 I LiveIconUtil: mIconDpi : 480 , mTargetIconDpi : 240
05-04 20:18:00.081  5670  6838 I AppIconSolution: load= live icon for com.sec.android.app.clockpackage, from overlay = false
05-04 20:18:00.082  5670  6838 I LauncherActivityInfo: Load live icon for com.sec.android.app.clockpackage
05-04 20:18:00.082  5670  6838 I LauncherActivityInfo: packageName: com.sec.android.app.clockpackage, useThemeIcon: false, height: 144, width: 144, density: 480
05-04 20:18:00.103  5670  5670 E libprocessgroup: set_timerslack_ns write failed: Operation not permitted
05-04 20:18:00.138  5270  5270 W GraphicUtils: getTextEmpty : skipped with null text
05-04 20:18:00.138  5270  5270 W GraphicUtils: setLinearGradientTextColor : skipped with null text
05-04 20:18:03.232  4462  4462 I SurfaceFlinger: SFWD update time=991188773612812
04-16 13:51:19.528  8065  8065 E tflite  : Average inference timings in us: Warmup: 38350.1, Init: 2158247, Inference: 70339.2Overall max resident set size = 65.7773 MB, total malloc-ed size = 0 MB, in-use allocated/mmapped size = 10.3201 MB  
04-16 13:51:19.528  8065  8065 E tflite  : Average inference timings in us: Warmup: 38350.1, Init: 2158247, Inference: 70339.2Overall max resident set size = 65.7773 MB, total malloc-ed size = 0 MB, in-use allocated/mmapped size = 10.3201 MB  
...

因此,我仍然需要grep“平均推理”行,而只需使用 sed 即可,正如@FritjofLarsson 所建议的那样

答案1

这应该可以(不需要grep):

#!/bin/sh

adb logcat | sed -n '
/Average inference/ {
    s/.*Warmup: //
    s/[^0-9]\{2,\}/ /g
    # Optional: remove the trailing space.
    s/ $//
    p
}
'

/Average inference/仅匹配包含“Average inference”的行。
s/.*Warmup: //丢弃sed第一次出现“Warmup: ”之前的任何内容。
s/[^0-9]\{2,\}/ /g将用空格替换每两个或更多连续的非数字字符。小数点将被保留,因为它被数字包围。将修剪在行尾替换“MB”时
s/ $//引入的尾随空格。与标志结合使用,以便仅输出修改后的行。s/[^0-9]\{2,\}/ /g
p-nsed

注意:您可以sed像这样将命令写在一行中:
sed -n '/Average inference/{s/.*Warmup: //;s/[^0-9]\{2,\}/ /g;s/ $//;p}'

相关内容