使用Awk管道从多行日志提取自动对焦相关参数并生成汇总
解决方案:直接用GNU Awk处理日志文件
下面的Awk脚本可以直接处理日志文件,无需依赖grep -B4管道,会自动跟踪触发词AutoFocus completed之前的目标参数,匹配到触发词时输出所需的时间戳和参数:
BEGIN { # 初始化变量 focuser_pos = "" avg_hfr = "" detected_stars = "" timestamp = "" } # 提取.log和|INFO之间的时间戳(适配常见日志格式,可根据实际日志调整正则) /\|INFO/ { match($0, /\.log\[(.*?)\]\|INFO/, ts_match) if (ts_match[1] != "") { timestamp = ts_match[1] } } # 捕获调焦器位置 /Moving Focuser to position/ { # 提取数字部分(假设格式为"Moving Focuser to position 1234") focuser_pos = $NF } # 捕获平均HFR /Average HFR:/ { # 提取冒号后的数值(假设格式为"Average HFR: 1.23") avg_hfr = $NF } # 捕获检测到的恒星数 /Detected Stars/ { # 适配带/不带冒号的格式 if ($NF ~ /^[0-9]+$/) { detected_stars = $NF } else { detected_stars = $(NF-1) } } # 触发输出逻辑 /AutoFocus completed/ { # 输出时间戳和参数,用制表符分隔,可按需调整分隔符 printf "%s\t%s\t%s\t%s\n", timestamp, focuser_pos, avg_hfr, detected_stars # 重置变量,避免下一轮触发时携带旧数据 focuser_pos = "" avg_hfr = "" detected_stars = "" timestamp = "" }
使用方法
- 将上述脚本保存为
extract_focus_data.awk - 在WSL终端中运行:
awk -f extract_focus_data.awk your_imaging_log.log
关键细节说明
- 时间戳提取:正则表达式
\.log\[(.*?)\]\|INFO适配了类似20240520_imaging.log[2024-05-20 14:22:15]|INFO的日志格式,如果你的日志时间戳格式不同,只需修改这部分正则即可。 - 参数捕获:针对不同参数的常见格式做了适配,若你的日志参数格式有差异,调整对应行的字段提取逻辑(比如
$NF代表最后一个字段,$(NF-1)代表倒数第二个字段)。 - 变量重置:每次触发输出后重置变量,确保下一组AutoFocus周期的参数不会和上一组混淆。
内容的提问来源于stack exchange,提问作者Gert Gottschalk
相关产品推荐
相关产品推荐

