Se você quer apenas evitar a criação de arquivos temporários (ou armazenar a saída do grep em uma variável), você pode alimentá-lo para um loop for assim:
#!/bin/bash
IFS=$'\n'
yay=0
nay=0
for line in 'avro-read /log/huge_data | grep $param1 | grep $param3'; do
[[ $line =~ $param2- ]] && yay=$(($yay + 1)) || nay=$(($nay + 1))
done
echo $yay / $nay \* 100 | bc -l
unset IFS
Eu criei uma versão modificada da abordagem em sua resposta automática que não exigirá arquivos temporários:
#!/bin/bash
(avro-read /log/huge_data | grep $param1 | grep $param3 | tee \
>(echo yay='grep -c "$param2-"') \
>(echo nay='grep -vc "$param2-"') \
>/dev/null | cat ; echo 'echo $yay / $nay \* 100 | bc -l') | sh
A saída dos comandos individuais grep -c
e o comando echo
são impressos como
yay=123
nay=456
echo $yay / $nay \* 100 | bc -l
para evitar condições de corrida 1 . A tubulação para sh
executa os comandos impressos.
1 O comando grep -c
concluído primeiro imprimirá a primeira linha de saída.