You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将awk/sed处理adb日志的结果存入变量?

问题描述

我需要从adb logcat的日志流中提取JSON数据,日志样例如下:

09-29 13:53:16.619 20268 20268 D Activity: onSuccess(): {"Data": {"Samples": [-247, -255, -260, -256, -246, -234, -220, -210, -208, -209, -210, -210, -204, -196, -185, -172], "Timestamp": 3543392}, "Uri": "214730------/Meas/---/500", "Method": "PUT"}

已经能用以下命令成功提取JSON并打印到控制台:

adb logcat | sed -n 's/.*onSuccess(): //p'

adb logcat | awk -F'onSuccess\(\)\: ' '{ print $2 }'
adb logcat | awk -F'onSuccess\(\)\: ' '{ X=$2; print X }'

但尝试将处理后的结果存入变量或在后续管道中使用时遇到问题:

  1. 以下命令无输出且卡住:
adb logcat | X=$(sed -n 's/.*onSuccess(): //p') | echo $X
  1. 以下命令持续打印X --- ,$X未被正确替换:
adb logcat | awk -F'onSuccess\(\)\: ' '{ X=$2; print X| cmd="echo X --- $X"; close(cmd); }'

请问如何正确获取sed/awk处理后的结果并在后续命令中使用?

解决方案

方法1:将处理结果存入变量(单次捕获或批量处理)

不要用管道直接赋值,而是将整个管道命令作为变量的赋值源:

# 捕获现有日志中的结果(-d参数获取当前已有的log,不会持续监听)
X=$(adb logcat -d | sed -n 's/.*onSuccess(): //p')
echo $X

# 持续监听日志并逐条处理结果
adb logcat | sed -n 's/.*onSuccess(): //p' | while read json; do
    echo "提取到的JSON: $json"
    # 此处可添加后续逻辑,比如写入文件、调用其他工具处理等
done

方法2:在awk中正确传递变量到外部命令

awk中调用外部命令时,不能直接在双引号里用$X,需要通过字符串拼接传递变量:

adb logcat | awk -F'onSuccess\(\)\: ' '{ 
    cmd="echo X --- " $2; 
    print | cmd; 
    close(cmd); 
}'

也可以用printf更清晰地输出:

adb logcat | awk -F'onSuccess\(\)\: ' '{ 
    printf "X --- %s\n", $2 | "cat"; 
    close("cat"); 
}'

方法3:直接管道传递给后续命令

如果只是要将提取的JSON传给下一个命令,直接用管道串联即可,无需中间变量:

# 将提取的JSON追加到文件
adb logcat | sed -n 's/.*onSuccess(): //p' >> extracted_json.log

# 用jq格式化JSON输出
adb logcat | sed -n 's/.*onSuccess(): //p' | jq .

内容的提问来源于stack exchange,提问作者jislam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:17:52