从grep结果中添加数字


23

我运行以下命令:

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

我得到以下结果:

1
4
0
8

我想将每个数字加到一个运行计数变量上。有人可以帮助我打造神奇的衬垫吗?

Answers:


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中的total返回到bash脚本?
阿米尔·阿富汗尼

2
@Amir您将使用第一个这样variable=$(grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }')的命令将命令的输出(仅是总和)放入名为variable
Shawn J. Goff

3
@Amir Afghani另外,您可能希望将grep更改为"[0-9]\+ errors"。如果您有行报告> 9错误,则此行将匹配。
肖恩·高夫

是的,哇,我简直不敢错过。谢谢。
阿米尔·阿富汗尼

Shawn,输出似乎没有将我的结果加起来。看起来像这样:总错误= + 259 + 7581 + 8852 + 2014 + 3189 ++ 13572 + 11438 +++ 6 + 4172 +
Amir


6

您似乎正在使用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

对我来说,第一个只是打印已经进入管道的内容...
Xerus

3

尝试将grep的输出传递到

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

2

我用这个:

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

如果数据以其他方式定界,则始终可以将行尾标记替换为特定的元素分隔符或字符类。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.