Tente isto:
echo $(( 100 * $( cut -d' ' -f10 access_log|grep "2.."|wc -l) / $(cut -d' ' -f10 access_log|wc -l) ))
Bash só pode manipular inteiros.
Estou tentando calcular qual é o% de consultas bem-sucedidas no log do apache. Eu tenho dois comandos:
cat access_log|cut -d' ' -f10|grep "2.."|wc -l
e
cat access_log|cut -d' ' -f10|wc -l
Eles me retornam o número de consultas bem-sucedidas e o número total de consultas. Eu quero calcular o que é o% de solicitações bem-sucedidas usando o bash e, se for possível, deve ser um script de linha. Supõe-se a saída apenas o número de% como - 50 ou 12 sem qualquer informação adicional.
Eu tentei usar o bc com ele, mas falhei por falta de conhecimento. Alguém pode me ajudar?
Usando awk
e somente percorre o arquivo de log uma vez:
awk '{if ((199 < $9) && ($9 < 300)) {SUMOK++} else {OTHER++}} END { printf "%d\n", ((SUMOK/NR)*100)}' access_log
Você pode tentar isso. Substitua $ 9 pelo número de campo correto do código de status.
awk '{if ($9 == 200) no_of_200+=1 } END{ perc=(no_of_200/NR)*100; print perc}' access.log
sed -ne'\|^\([^ ]* *\)\{9\}2..|=;$=;$s|.*|2ksmzlm/p|'|dc
... funciona ...
por exemplo:
printf %s\n 1 2 3 4 5 6 7 8 9 10 |
sed -ne'/1/=;$=;$s|.*|2ksmzlm/p|p'|dc
.20
... para mostrar que sed
correspondia ao padrão 1
contra 20% de suas linhas de entrada.