grepの結果から数値を追加する


23

次のコマンドを実行します。

grep -o "[0-9] errors" verification_report_3.txt | awk '{print $1}'

そして、私は次の結果を得る:

1
4
0
8

各数値を実行中のカウント変数に追加したいと思います。誰かが私を構築するのに役立つ魔法のワンライナーはありますか?

回答:


31
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 }'

ショーン-答えてくれてありがとう。awkからbashスクリプトに合計を戻すにはどうすればよいですか?
アミールアフガニ

2
@Amir variable=$(grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }')このように最初のものを使用します。これにより、コマンドの出力(合計値のみ)が呼び出される変数variable
ショーンJ. Goff

3
@Amir Afghaniまた、grepをに変更することもできます"[0-9]\+ errors"。これは、9を超えるエラーを報告する行がある場合に一致します。
ショーンJ.ゴフ

うん、すごい、それを見逃したなんて信じられない。ありがとうございました。
アミールアフガニ

ショーン、結果は私の結果を追加していないようです。合計エラー= + 259 + 7581 + 8852 + 2014 + 3189 ++ 13572 + 11438 +++ 6 + 4172 +
Amir Afghani

8

これはすべてawkでも実行できます。

awk '"[0-9]+ errors" {sum += $1}; END {print sum}' verification_report_3.txt

6

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

私にとって最初のものは、すでにパイプに入ったものを印刷するだけです
...-Xerus

3

grepからの出力をパイプしてみてください

awk 'BEGIN {total=0;}{total+=$1;}END {print "Total: ",total}'

2

私はこれを使用します:

$ 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; }

データが別の方法で区切られている場合、特定の要素区切り文字または文字クラスを行末マーカーでいつでも置き換えることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.