Shell脚本使用wc -l统计文件行数结果与实际不符问题咨询
Shell脚本异常排查解答
异常根因
- 该异常和脚本执行路径没有任何关系,属于逻辑理解错误:
- 你手动执行
wc -l Turbine_DATA时,统计对象是文件的内容行数,因此得到结果3 - 脚本中
wc -l的统计对象是前面find命令的输出结果行数:find ${mount} -maxdepth 1 -type f -name "$i"只会返回匹配到的1个文件路径,输出只有1行,因此wc -l得到的结果永远是1,实际你统计的是匹配的文件数量,不是文件内容的行数。
- 你手动执行
- 额外验证:脚本中所有操作都使用了绝对路径
${mount}(值为/transfer/input),不管在哪个目录执行,查找的路径都是固定的,执行路径不会影响结果。
定位方法
你可以在计算Filecount的行前添加调试日志,确认find的输出内容:
echo "find匹配结果:$(find ${mount} -maxdepth 1 -type f -name "$i")" >> src/cb.log
运行后就能看到find只输出了1行文件路径,验证统计逻辑错误的判断。
修复方案
如果你的需求是统计匹配文件的内容行数,修改计算Filecount的逻辑即可:
方案1(直接读取目标文件统计,性能更高)
Filecount=$(wc -l < "${mount}/${i}")
方案2(保留find查找逻辑,适合可能存在多匹配的场景)
Filecount=$(find ${mount} -maxdepth 1 -type f -name "$i" -exec wc -l {} + | awk '{print $1}')
小提示:原脚本中
array=( $(find ...) )的写法存在文件名兼容问题,如果文件名包含空格、换行符会导致数组赋值错误,生产环境建议使用while read的方式遍历find结果。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

