Answers:
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错误,则此行将匹配。
这也可以在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 I修改了正则表达式(添加了+量词)以允许数字> 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
对于大型列表而言,它效率不高,但是对于我的大多数用例来说,它都很好。我通常使用shell函数来自动执行该过程,因此我只需要提供一个文件名即可:
## 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; }
如果数据以其他方式定界,则始终可以将行尾标记替换为特定的元素分隔符或字符类。