如何使用for循环从文件中查找Error1、Error2、Error3三类错误
优化后for循环实现脚本
以下脚本完全兼容POSIX标准,适配你原有的#!/bin/sh解释器:
#!/bin/sh REPORT_PATH="/home/new/Report.txt" # 遍历所有错误类型 for err_type in Error1 Error2 Error3; do # 遍历所有4台机器 for mach_id in 1 2 3 4; do match_str="${err_type} in Machine ${mach_id}" # grep加-q参数静默执行,仅返回匹配状态,不输出内容 if grep -q -R "${match_str}" "${REPORT_PATH}"; then echo "${err_type} found in Machine ${mach_id}" whiptail --title "Report Error" --msgbox "${err_type//Error/Error } in Machine ${mach_id}" 8 78 else # 不需要无错误提示可以注释掉下行,避免输出过多冗余信息 echo "No Error found" fi done done
逻辑说明
- 双层for循环自动组合所有错误类型+机器的匹配场景,无需重复编写if判断语句,后续要新增错误类型或机器只需修改循环的遍历列表即可
grep -q参数实现静默检测,不会把匹配到的文件内容直接打印到终端,仅通过返回值判断是否匹配成功- 弹窗内容的
${err_type//Error/Error }是为了把Error1自动转为Error 1,匹配你原有弹窗的显示格式,如果你不需要空格可以直接用${err_type}替换。
如果你的场景只需要检测原脚本中列出来的4种特定组合,不需要全量遍历所有错误和机器,也可以直接把要检测的组合写到单循环里:
#!/bin/sh REPORT_PATH="/home/new/Report.txt" # 直接列出所有需要检测的错误组合 for match_rule in "Error1 in Machine 1" "Error2 in Machine 1" "Error2 in Machine 2" "Error3 in Machine 3"; do if grep -q -R "${match_rule}" "${REPORT_PATH}"; then echo "${match_rule} found" # 替换出弹窗需要的空格格式 msg_str=$(echo "${match_rule}" | sed 's/Error\([0-9]\)/Error \1/') whiptail --title "Report Error" --msgbox "${msg_str}" 8 78 else echo "No Error found" fi done
内容的提问来源于stack exchange,提问作者Fatima
相关产品推荐
相关产品推荐

