Добавление чисел из результата grep

Я запускаю следующую команду:

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

и я получаю следующий результат:

 1 4 0 8 

Я хотел бы добавить каждое из чисел до переменной счетчика. Есть ли волшебный один лайнер, который кто-то может мне помочь?

 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:

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

Кажется, вы используете 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; } 

Вы всегда можете подставить маркер конца строки для отдельного разделителя элементов или класса символов, если ваши данные разделены другим способом.