Uma solução geral para números arbitrários de arquivos:
for file1 in log1.txt log2.txt logN.txt; do
for file2 in logA.txt logB.txt logC.txt; do
for file3 in logD.txt logE.txt logF.txt; do
match1=$(tail -n 5147 $file1 | grep -c 'The line');
match2=$(grep -c "the line" $file2);
match3=$(grep -c "the line" $file3);
echo "($match1 + $match2 + $match3) * 200" | bc;
done;
done;
done
Isso contará as ocorrências de the line
nas últimas 5147 linhas de cada $file1
s e salvará isso como $match1
. Em seguida, ele contará as ocorrências de the line
em cada uma das $file2
s e as salvará como match2
e o número de ocorrências em cada file3
as $match3
. Então, calculará ($match1 + $match2 + $match3) * 200
.
Basta adicionar mais um arquivo ao que você está fazendo e corrigir sua sintaxe:
echo "$(tail -n 5147 Log1.log.2013-11-18 | grep -c 'The line') \
$(grep -c 'The line' Log2.log) $(grep -c 'The line' Log3.log)" |
awk '{print ($1+$2+$3)*200}'
Existem alguns truques aqui. grep -c
conta correspondências em vez de imprimi-las, portanto, não há necessidade de wc
. awk
pode fazer matemática, então não há necessidade de bc
. Eu uso echo
em vez de expr
porque eu não estou mais fazendo aritmética no shell, apenas ecoando os resultados das três pesquisas e passando-as para awk
. Isso deve resultar em algo como:
echo "10 4 12" | awk '{print ($1+$2+$3)*200}'
Uma versão mais concisa:
echo $((($(tail -n 5147 Log1.log.2013-11-18 | grep -c "The line) + \
$(grep -c "The line" Log2.log) + $(grep -c "The lne" Log3.log)) * 200))
Isso faz toda a matemática no shell, usando a notação $(( ))
. Você pode tentar com echo $((2*4))
. Não é muito fácil de ler, ele se expande para:
echo "$(( ($file1_matches + $file2_matches + $file3_matches) * 200 ))"