我目前正在grep
与adb logcat
(android 控制台 api)结合使用。现在我想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
使用“平均推理”行,只是按照@FritjofLarsson 的建议使用 sed
这应该这样做(不需要
grep
):/Average inference/
只会匹配包含“平均推理”的行。在第一次出现“Warmup:”之前丢弃任何东西s/.*Warmup: //
。将用空格替换每两个或更多连续的非数字字符。小数点将被保留,因为它被数字包围。将修剪在行尾替换“MB”时引入的尾随空格。与flag 结合使用,以便仅输出修改后的行。sed
s/[^0-9]\{2,\}/ /g
s/ $//
s/[^0-9]\{2,\}/ /g
p
-n
sed
注意:您可以将
sed
命令写在一行中,如下所示:sed -n '/Average inference/{s/.*Warmup: //;s/[^0-9]\{2,\}/ /g;s/ $//;p}'