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

Sta*_*rry 0 linux bash shell awk grep

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

Amount: 20
Amount: 30.1
Run Code Online (Sandbox Code Playgroud)

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

命令如下:

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

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

fed*_*qui 5

你可以用这个:

awk '/^Amount/ {amount+=$2} END {print amount+0}' file
Run Code Online (Sandbox Code Playgroud)

有了这个+0技巧,你可以0在没有设置值的情况下进行打印.

说明

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

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

另请注意,无需将"Amount"设置为字段分隔符.它足以使用默认值(空格).

测试

$ 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
Run Code Online (Sandbox Code Playgroud)