linux - grep : print value when grep returns nothing 之后的 awk

标签 linux bash shell awk grep

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

Amount: 20
Amount: 30.1

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

命令如下:

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

它对我来说很好用。但是,有时 mylog.log 文件不包含关键字“Amount”。在这种情况下,我想打印 0,但上面的 awk 命令什么也不会打印。当 grep 什么都不返回时,我怎样才能让 awk 打印一些东西?

最佳答案

你可以使用这个:

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

使用 +0 技巧可以打印 0 以防未设置值。

说明

不需要grep + awk。 awk 单独可以 grep(以及更多东西!):

  • /^Amount/{} 在以“Amount”开头的行上,执行 {} 中的内容。
  • amount+=$2 将字段 2 的值添加到计数器“amount”。
  • 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

关于linux - grep : print value when grep returns nothing 之后的 awk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25544974/

相关文章:

linux - 什么是路径//,它与/有何不同

linux - 从文件中过滤具有给定前缀的特定行

bash - 如何确保仅在对包含该脚本的文件夹进行更改时才为特定脚本触发 travis 构建

linux - 等到第一个 .jar 文件完成后,再在 for 循环中执行第二个 .jar 文件

php - 使用 php 使用 sudo 执行命令

Bash 脚本文件描述符 echo

c - 无法识别的 jedec id

c - 使用Linux POSIX IPC消息队列

linux - 在文件的每一行前面打印文件名

linux - 在 Linux 中执行文件操作时如何排除文件夹,即 cp、mv、rm 和 chown 等