Shell脚本处理confirmerror输出提取指定字段并按要求格式输出的问题
问题诊断与修复方案
原脚本核心问题
- 传参处理错误:调用
result函数时传入的是日志行文本,原脚本在result函数内错误将$1作为可执行命令包裹在$()中运行,正确逻辑是将$1的内容通过echo输出后再传递给awk处理 - 错误描述截取不全:原脚本只提取了第6到第9个字段作为描述,会丢失第9字段之后的所有日志内容,需要改为提取从第6个字段到行尾的全部内容
- 行读取逻辑缺陷:
while read line未添加IFS=和-r参数,可能出现行首尾空白被截断、转义字符被意外解析的问题
修复后完整脚本
confirmerror(){ # 假设trimline是你自定义的行裁剪函数,保证输出为处理后的日志行即可 trimline|awk -F ':' '{if($5 != "") print}' } result(){ deviceName=$(echo "$1"|awk '{print $4}') processId=$(echo "$1"|awk '{print $5}'|awk -F '[^0-9]*' '{print $2}') processName=$(echo "$1"|awk '{print $5}') # 从第6个字段开始截取到行尾全部内容 description=$(echo "$1"|awk '{for(i=6;i<=NF;i++) printf "%s ", $i; print ""}') echo "$deviceName" echo "$processId" echo "$processName" echo "$description" } # 修复行读取逻辑,避免空白和转义问题 confirmerror | while IFS= read -r line; do result "$line"; done
优化方案(可选)
上述方案是在你原逻辑基础上最小修改实现需求,你也可以直接用单条awk命令实现全部逻辑,避免多次管道调用,性能更高:
confirmerror | awk '{ print $4 split($5, arr, /[^0-9]+/) print arr[2] print $5 for(i=6;i<=NF;i++) printf "%s ", $i print "" }'
内容的提问来源于stack exchange,提问作者YYZZYY
相关产品推荐
相关产品推荐

