每次访问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
只是一个字符串;这些字符串不是实际上调用cat
或wc
。
一步一步来……
$ 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=5
和acc_cnt=91
生成:
5.200
这里的一个问题是,在计算的每一步都应用尺度,这会导致准确性的损失。
考虑一个小修改:
$ echo "scale=3; ( ${err_cnt} * 100.0 ) / ( ${err_cnt} + ${acc_cnt} )" | bc
5.208
虽然可以通过在echo中嵌入cut | wc
操作来消除两个变量(err_cnt
和acc_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次扫描。