grep之后的awk:当grep什么都不返回时打印值

时间:2014-08-28 09:09:47

标签: linux bash shell awk grep

当我使用awk和grep来解析日志文件时,我有一个问题。 日志文件包含一些带有数字的字符串,例如

Amount: 20
Amount: 30.1

我使用grep用关键字" Amount"来解析这些行,然后使用awk获取金额并做一笔总和:

命令如下:

cat mylog.log | grep Amount | awk -F 'Amount: ' '{sum+=$2}END{print sum}'

对我来说很好。但是,有时mylog.log文件不包含关键字' Amount'。在这种情况下,我想打印0,但上面的awk命令将不打印任何内容。当grep什么都不返回时,如何让awk打印出来呢?

3 个答案:

答案 0 :(得分:5)

您可以使用:

awk '/^Amount/ {amount+=$2} END {print amount+0}' file

使用+0技巧,如果未设置值,则打印0

解释

没有必要grep + awk。 awk一个人可以grep(以及更多东西!):

  • /^Amount/ {}以" Amount"开头的行,执行{}中的内容。
  • amount+=$2将字段2的值添加到计数器"金额"。
  • 处理完整个文件后,
  • END {print amount+0}打印amount的值。如果之前未设置,则执行+0会使其打印0

另请注意,无需设置金额'作为字段分隔符。它足以使用默认值(空格)。

测试

$ cat a
Amount: 20
Amount: 30.1
$ awk '/^Amount/ {amount+=$2} END {print amount+0}' a
50.1

$ cat b
hello
$ awk '/^Amount/ {amount+=$2} END {print amount+0}' b
0

答案 1 :(得分:2)

如果你的行只包含“金额:20”,那么使用@ fedorqui的解决方案,但如果它更像是“快速棕色狐狸有金额:20个香蕉”,那么使用:

awk -F'Amount:' 'NF==2{sum+=$2} END{print sum+0}' file

答案 2 :(得分:1)

Awk one-liner,

awk -F 'Amount: ' '/Amount:/{print "1";sum+=$2}!/Amount:/{print "0"}END{print sum}' file

上面的awk命令会打印包含字符串Amount的行的数字1,并为没有字符串0的行打印Amount。并且如果在一行上找到字符串Amount,则它将值(第2列)存储到sum变量,并将其与任何其他值相加。最后,变量sum的值最后打印出来。

示例:

$ cat file
Amount: 20
Amount: 30.1
foo bar
adbcksjc
sbcskcbks
cnskncsnc
$ awk -F 'Amount: ' '/Amount:/{print "1";sum+=$2}!/Amount:/{print "0"}END{print sum}' file
1
1
0
0
0
0
50.1