回答:
grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }'
リストは出力されませんが、合計は出力されます。リストと合計の両方が必要な場合は、次のことができます。
grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1; print $1} END { print SUM }'
variable=$(grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }')
このように最初のものを使用します。これにより、コマンドの出力(合計値のみ)が呼び出される変数variable
"[0-9]\+ errors"
。これは、9を超えるエラーを報告する行がある場合に一致します。
GNUシステムを使用しているように見えるため、Perlの正規表現のサポートが利用可能な場合、次のように記述できます。
grep -Po '[0-9]+(?=\s+errors)' infile |
paste -sd+ |
bc
PS正規表現を変更して(+量指定子を追加)、9より大きい数を許可しました。
PSあるいは、awkで十分です(GNU awkを想定):
awk 'END { print s }
/[0-9]+[[:space:]]+errors/ {
s += $1
}' infile
grepからの出力をパイプしてみてください
awk 'BEGIN {total=0;}{total+=$1;}END {print "Total: ",total}'
私はこれを使用します:
$ echo $(cat file | sed 's/$/+/') 0 | bc
リストが大きい場合は効率的ではありませんが、ほとんどのユースケースでは問題ありません。私は通常、シェル関数を使用してプロセスを自動化するため、ファイル名を指定するだけで済みます。
## cheezy summation
## call from .bashrc
##
getsum () { echo $(cat $1 | sed 's/$/+/') 0 | bc; }
gethsum () { echo $(cat $1 | sed 's/[gG]/*1000M/' | sed 's/[mM]/*1000K/' | sed 's/[kK]/*1000/' | sed 's/$/+/') 0 | bc; }
gethexsum () { echo ibase=16 $(cat $1 | sed 's/$/+/') 0 | bc; }
データが別の方法で区切られている場合、特定の要素区切り文字または文字クラスを行末マーカーでいつでも置き換えることができます。