使用Bash脚本读取日志提取salary后数值判断是否为MNC
修复方案
你原有脚本存在4个核心问题:
- 正则匹配规则仅支持薪资到行尾的场景,没有兼容后缀带邮箱的情况,也未限制5-6位数字的匹配要求
- 提取到多组薪资数据时直接做数值判断会触发语法错误
[ $salary > 2000 ]属于字符串比较逻辑,不是数值比较,判断结果会出错- 未处理提取不到任何薪资数据的边界场景
修复后完整脚本
# 提取salary后紧邻的5-6位数字,兼容后面带邮箱、空格、行尾的多种场景 salary_list=$(grep -oP 'salary\s+\K[1-9]\d{4,5}(?=\s|$|@)' tso.txt) # 初始化MNC标记位 is_mnc=0 # 遍历所有提取到的薪资数值 for sal in $salary_list; do # 改用shell数值比较参数-gt,判断逻辑准确 if [ $sal -gt 2000 ]; then is_mnc=1 # 找到符合要求的薪资直接终止遍历,提高执行效率 break fi done if [ $is_mnc -eq 1 ]; then echo "it is mnc....." else echo "it is unknown....." fi
关键改动说明
- 正则新增
-P参数启用Perl正则规则,\K会忽略前面salary\s+的匹配内容,直接提取后续数字 [1-9]\d{4,5}严格匹配5到6位的正整数,避免匹配到不符合要求的短数字(?=\s|$|@)正向预查逻辑,适配数字后接空格、行尾、邮箱@符号的多种场景- 新增遍历逻辑,只要存在一个薪资高于2000就标记为MNC,解决多值判断报错问题
- 数值比较改用
-gt参数,符合shell数值比较语法要求
内容的提问来源于stack exchange,提问作者Muhammad Mustafa
相关产品推荐
相关产品推荐

