Bash+Busybox Awk脚本时间字段错位问题修复求助
修复Busybox Awk提取字段错位问题
问题根源
时间字段和其他目标字段(文件大小、Video FPS、napiprojekt链接)不在同一行,原脚本未做关联缓存,导致时间被捕获后要等到下一个条目才输出,最终整体下移一行。
适配Busybox Awk的修复方案
Busybox Awk仅支持POSIX标准语法,不能使用GNU Awk的扩展功能,以下两种方案根据你的1.html结构选择:
方案1:时间行与数据行非相邻(通用场景)
用变量缓存捕获到的时间,等到遇到包含所有目标数据的行时,再一起输出并清空缓存:
#!/usr/bin/awk -f # 匹配时间行,缓存时间字符串 /[0-9]{2}:[0-9]{2}:[0-9]{2}/ { # 替换成你实际匹配时间的正则(比如包含标签特征) match($0, /[0-9]{2}:[0-9]{2}:[0-9]{2}/) time_str = substr($0, RSTART, RLENGTH) next } # 匹配包含其他字段的行,提取并关联时间输出 /文件大小/ && /Video FPS/ && /napiprojekt/ { # 替换成实际匹配特征 # 提取文件大小 match($0, /[0-9.]+\s*(MB|GB)/) size = substr($0, RSTART, RLENGTH) # 提取Video FPS match($0, /Video FPS: ([0-9.]+)/) fps = substr($0, RSTART + 11, RLENGTH - 11) # 提取napiprojekt链接 match($0, /napiprojekt\.pl\/[^"]+/) link = substr($0, RSTART, RLENGTH) # 确保有缓存的时间才输出,避免空值 if (time_str != "") { print time_str, size, fps, link time_str = "" # 清空缓存,防止复用旧时间 } }
方案2:时间行与数据行相邻
如果时间行之后直接是包含其他字段的行,用getline读取下一行直接关联:
#!/usr/bin/awk -f /[0-9]{2}:[0-9]{2}:[0-9]{2}/ { # 匹配时间行 match($0, /[0-9]{2}:[0-9]{2}:[0-9]{2}/) time_str = substr($0, RSTART, RLENGTH) # 读取下一行数据 if (getline > 0) { # 提取文件大小 match($0, /[0-9.]+\s*(MB|GB)/) size = substr($0, RSTART, RLENGTH) # 提取Video FPS match($0, /Video FPS: ([0-9.]+)/) fps = substr($0, RSTART + 11, RLENGTH - 11) # 提取napiprojekt链接 match($0, /napiprojekt\.pl\/[^"]+/) link = substr($0, RSTART, RLENGTH) print time_str, size, fps, link } next }
关键注意事项
- 所有正则表达式需根据
1.html的实际HTML结构调整,比如时间可能在<span class="duration">标签内,需要精准匹配标签特征 - 全程使用POSIX Awk兼容的
match()和substr()函数,避免GNU Awk独有的扩展(比如gensub()) - 每次输出后清空时间缓存,防止条目错位
内容的提问来源于stack exchange,提问作者D S
相关产品推荐
相关产品推荐

