Bash使用awk提取文件指定关键词后首个数值的问题求解
问题原因
原脚本通过$NF提取行最后一个字段的逻辑,仅适用于目标值位于整行末尾的场景。当关键词出现在行中部、关键词后还存在其他字段和数值时,取行尾字段必然会拿到无关的末尾值,无法定位关键词后紧邻的目标数值。
修复方案
放弃依赖行字段相对位置的取值逻辑,改为定位到关键词后,直接在关键词后续的内容中匹配第一个符合格式的数值,该逻辑同时兼容原有行尾取值的场景,不受关键词所在行位置、后续字段数量的影响。
修改后的完整脚本如下:
local output="$1" local ext="log" # 注意关键词需与文件内文本完全匹配,示例中关键词末尾带冒号请勿遗漏 local word="SOME(X) WORD:" cd "$dir" find "${output}" -type f -name "*.${ext}" -exec awk -v ptn="${word}" ' index($0, ptn) { # 截取关键词位置之后的所有剩余内容 rest_content = substr($0, index($0, ptn) + length(ptn)) # 匹配剩余内容中第一个带可选负号的数值 if (match(rest_content, /-?[0-9]+\.?[0-9]*/)) { print substr(rest_content, RSTART, RLENGTH), FILENAME } } ' {} +
适配说明
- 原有提取行尾数值的场景无需修改配置即可正常运行
- 关键词后无论间隔多少个空格、后续存在多少个其他数值,都会精准返回关键词后第一个匹配的数值,也就是示例中需要的
-1.0475392439 - 如果待提取的数值存在科学计数法格式(比如
-1.23e-4),可以把匹配正则替换为/-?[0-9]+\.?[0-9]*([eE][+-]?[0-9]+)?/即可兼容
内容的提问来源于stack exchange,提问作者Alert
相关产品推荐
相关产品推荐

