Linux grep后的awk:grep不返回任何内容时打印值

Linux grep后的awk:grep不返回任何内容时打印值,linux,bash,shell,awk,grep,Linux,Bash,Shell,Awk,Grep,当我使用awk和grep解析日志文件时,我有一个问题。 日志文件包含一些带有数字的字符串,例如 Amount: 20 Amount: 30.1 我使用grep解析带有关键字Amount的行,然后使用awk获取金额并进行求和: 该命令类似于: cat mylog.log | grep Amount | awk-F'金额:'{sum+=$2}结束{print sum}' 这对我来说很好。但是,有时mylog.log文件不包含关键字“Amount”。在这种情况下,我想打印0,但上面的awk命令将不打

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

Amount: 20
Amount: 30.1
我使用grep解析带有关键字Amount的行,然后使用awk获取金额并进行求和:

该命令类似于:

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

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

Awk一个班轮

awk -F 'Amount: ' '/Amount:/{print "1";sum+=$2}!/Amount:/{print "0"}END{print sum}' file
上面的awk命令将为具有字符串数量的行打印数字1,并为不具有字符串数量的行打印0。此外,如果在一行中找到字符串金额,则它将valuecolumn 2存储到sum变量中,并将其与任何其他值相加。最后,在最后打印变量和的值

例如:

您可以使用以下选项:

awk '/^Amount/ {amount+=$2} END {print amount+0}' file
使用+0技巧,在未设置值的情况下,使其打印0

解释 没有必要grep+awk。只有awk可以grep和更多的东西!:

/^Amount/{}在以Amount开头的行上,执行{}中的内容。 金额+=$2将字段2的值添加到计数器金额。 结束{打印金额+0}处理完整个文件后,打印金额的值。如果之前没有设置,执行+0将使其打印0。 注意:也不需要将“金额”设置为字段分隔符。它满足了默认的一个空间

测验
如果您的行仅包含数量:20,则使用@fedorqui的解决方案,但如果它更像是quick brown fox的数量:20香蕉,则使用:

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

awk-F'Amount:'BEGIN{sum=0}{sum+=2}END{print sum}'你永远不需要grep和awk,也不需要cat和其中任何一个。我试过了,-F'Amount:'单独在我的GNU awk 4.1.0上工作。我猜在进行整数计算时,尾随空格会被删除。@fedorui您是对的,但在本例中是s/trailing/leading/。我会更新的。谢谢。谢谢你的回答!这确实是对我的问题的扩展解决方案。我想把你的解决方案和@fedorqui都标为最佳答案,但不幸的是我只能标一个。如果我有多个关键字,我应该如何使用awk?e、 g.我想找到包含fox和amount的行,并在amount之后求和值:?@Starry一个解决方案是使用awk-F'amount:'/fox/&&NF==2{sum+=2}END{print sum+0}文件。通过添加/fox/表示记录行必须包含此模式。
$ 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
awk -F'Amount:' 'NF==2{sum+=$2} END{print sum+0}' file