Wenn Sie nur vermeiden möchten, temporäre Dateien zu erstellen (oder die Ausgabe von grep in einer Variablen zu speichern), können Sie sie einer for-Schleife wie folgt zuführen:
#!/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
Ich habe in Ihrer Selbstantwort eine modifizierte Version des Ansatzes erstellt, für die keine temporären Dateien erforderlich sind:
#!/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
Die Ausgabe der einzelnen grep -c
Befehle und des echo
Befehls wird als gedruckt
yay=123 nay=456 echo $yay / $nay \* 100 | bc -l
Rennbedingungen vermeiden 1 . Piping zum sh
Ausführen der gedruckten Befehle.
1 Je nachdem, welcher grep -c
Befehl zuerst beendet wird, wird die erste Ausgabezeile gedruckt.