Issue
Each access to the web server results in either an access log entry or an error log entry. So that the total entries in access log + total entries in error log = total access attempts. What percentage of connections resulted in errors.... to 3 decimal places.
I tried piping the 2 files to do a percentage error, but I get the following error
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
Solution
Remove the | bc
(at the end) and run the command; you're generating one long line of text and then feeding it to bc
...
scale=3; cat error.log | wc -l / ( cat access.log | wc -l + cat error.log | wc -l ) * 100.0
... but this long line of text is just gibberish as far as bc
is concerned.
One issue, the cat ... | wc -l
is just a string of characters; these strings do not actually call cat
nor wc
.
Taking this one step at a time ...
$ 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
Assuming err_cnt=5
and acc_cnt=91
this generates:
5.200
One issue here is that the scale is applied at each step in the calculation which causes the loss of accuracy.
Consider a small modification:
$ echo "scale=3; ( ${err_cnt} * 100.0 ) / ( ${err_cnt} + ${acc_cnt} )" | bc
5.208
While it would be possible to eliminate the 2 variables (err_cnt
and acc_cnt
) by embedding the cut | wc
operations within the echo ...
$ echo "scale=3; ( $(cat error.log | wc -l) * 100.0) / ( $(cat error.log | wc -l) + $(cat access.log | wc -l) )" | bc
5.208
... this gets a bit cumbersome while also requiring 2 scans of the error.log
file.
Answered By - markp-fuso Answer Checked By - David Marino (WPSolving Volunteer)