如何将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 }'
但尝试将处理后的结果存入变量或在后续管道中使用时遇到问题:
- 以下命令无输出且卡住:
adb logcat | X=$(sed -n 's/.*onSuccess(): //p') | echo $X
- 以下命令持续打印
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
相关产品推荐
相关产品推荐

