当我使用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打印出来呢?
答案 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