求Web服务器错误连接占比(保留三位小数)及命令报错排查
解决Web服务器错误连接占比计算的命令报错
问题背景
Web服务器每次访问会生成一条访问日志或错误日志条目,总访问尝试次数 = 访问日志条目数 + 错误日志条目数。需要计算错误连接占比并保留三位小数,执行以下命令时触发语法错误:
echo 'scale=3;' 'cat error.log | wc -l' / '(' 'cat access.log | wc -l' + 'cat error.log | wc -l' ') * 100.0' | bc
报错内容:
(standard_in) 1: syntax error (standard_in) 1: illegal character: | (standard_in) 1: syntax error (standard_in) 1: illegal character: | (standard_in) 1: syntax error (standard_in) 1: illegal character: | (standard_in) 1: syntax error
错误原因
bc是纯数学计算工具,只能解析数学表达式,无法识别shell的管道符|、cat/wc这类命令。直接把shell命令传给bc,会被当作非法字符处理,导致报错。
正确解决方案
方案一:先通过Shell变量获取日志行数,再计算
先分别统计两个日志的行数存入变量,再将变量代入数学表达式传给bc:
# 统计错误日志行数 error_lines=$(wc -l < error.log) # 统计访问日志行数 access_lines=$(wc -l < access.log) # 计算占比并保留三位小数 echo "scale=3; $error_lines / ($access_lines + $error_lines) * 100.0" | bc
注:wc -l < 文件名比cat 文件名 | wc -l更高效,避免创建多余的cat进程。
方案二:用awk一次性完成统计与计算
用awk直接遍历日志文件完成行数统计和占比计算,无需额外工具:
awk 'BEGIN{err=0} {err++} ENDFILE{if(FILENAME=="access.log") acc=NR} END{printf("%.3f\n", err/(acc+err)*100)}' error.log access.log
解释:awk先遍历error.log统计总行数到err,再遍历access.log统计总行数到acc,最后用printf格式化输出三位小数的占比结果。
内容的提问来源于stack exchange,提问作者Akhil
相关产品推荐
相关产品推荐

