Shell for循环遍历txt文件生成匹配行输出文件脚本报错求助
脚本问题修复说明
你的脚本存在多处语法和逻辑错误,逐一修正后即可正常运行,核心错误点如下:
- 解释器不匹配:脚本开头指定
#!/bin/sh,但使用了bash专属的[[ ]]正则匹配语法,sh环境无法执行 - 正则匹配语法错误:
[[ ]]结构中运算符、变量前后必须加空格,且匹配顺序是[[ 待匹配内容 =~ 正则规则 ]],原脚本写反了匹配顺序、漏了必填空格 - 输入重定向缺失:
while read循环没有绑定要读取的目标文件,根本读不到txt文件的内容 - 逻辑笔误:失败分支的匹配对象误写为
$,实际应该匹配当前行$line - 算术运算语法错误:shell中自增运算必须放在
(( ))算术运算结构中,直接写count_success++无法执行 - 遍历范围错误:原循环遍历目录下所有内容,没有过滤
.txt后缀,会把子目录、其他格式文件也纳入处理 - 输出文件名异常:直接拼接完整路径生成输出文件名,会因为路径带
/导致文件名非法、输出文件位置混乱 - 冗余转义问题:正则规则中多余的转义符会导致匹配失效
- 重复写入问题:没有提前清空历史输出文件,多次运行会重复追加历史内容
- 冗余内容:脚本末尾多余的
~是vim类编辑器的行尾残留标记,运行时会被识别为不存在的命令,需要删除
修复后可直接运行的代码
#!/bin/bash # 编译结果统计脚本 # 定义匹配正则,移除多余转义 success="Compiling\s\".*\"\s-\sSucceeded" failure="Compiling\s\".*\"\s-\sFailed" count_success=0 count_failure=0 # 指定报告目录,仅遍历.txt后缀文件 report_dir=~/Documents/reports for file in "$report_dir"/*.txt; do # 跳过目录下无txt文件时的通配符异常 [ -e "$file" ] || continue # 提取纯文件名生成输出路径,默认输出到当前执行目录 filename=$(basename "$file") output_file="./output_${filename}" # 提前清空历史输出内容 > "$output_file" # 逐行读取当前文件内容 while read -r line; do # 匹配编译成功行 if [[ $line =~ $success ]]; then echo "$line" >> "$output_file" ((count_success++)) # 匹配编译失败行 elif [[ $line =~ $failure ]]; then echo "$line" >> "$output_file" ((count_failure++)) fi done < "$file" # 将当前文件绑定为while循环的输入源 done # 输出最终统计结果 echo "$count_success of jobs ran successfully" echo "$count_failure of jobs didn't work"
使用注意事项
- 运行前先给脚本加执行权限:执行
chmod +x 你的脚本文件名.sh后再启动 - 如果需要把输出文件和原报告文件存在同一目录,把
output_file的定义修改为"$report_dir/output_${filename}"即可 - 正则规则可以根据实际日志格式微调,如果日志中关键字前后有其他固定标识,直接修改对应正则变量的取值即可
内容的提问来源于stack exchange,提问作者jlaralopez
相关产品推荐
相关产品推荐

