导致错误的连接百分比.到小数点后3位



每次访问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(在末尾)并运行命令;你正在生成一长行文本,然后将其提供给bc

scale=3; cat error.log | wc -l / ( cat access.log | wc -l + cat error.log | wc -l ) * 100.0

…但是对于bc来说,这一长行文本只是胡言乱语。

一个问题,cat ... | wc -l只是一个字符串;这些字符串不是实际上调用catwc

一步一步来……

$ err_cnt=$(cat error.log | wc -l)
$ acc_cnt=$(cat access.log | wc -l)
$ echo "scale=3; ${err_cnt} / ( ${err_cnt} + ${acc_cnt} ) * 100" | bc

假设err_cnt=5acc_cnt=91生成:

5.200

这里的一个问题是,在计算的每一步都应用尺度,这会导致准确性的损失。

考虑一个小修改:

$ echo "scale=3; ( ${err_cnt} * 100.0 ) / ( ${err_cnt} + ${acc_cnt} )" | bc
5.208

虽然可以通过在echo中嵌入cut | wc操作来消除两个变量(err_cntacc_cnt)…

$ echo "scale=3; ( $(cat error.log | wc -l) * 100.0) / ( $(cat error.log | wc -l) + $(cat access.log | wc -l) )" | bc
5.208

…这有点麻烦,同时还需要对error.log文件进行2次扫描。