【问题标题】:Linux commandline find and add up numbersLinux 命令行 查找和相加数字
【发布时间】:2016-01-14 17:01:46
【问题描述】:

在可能包含不同形式信息的日志文件中,我只需要 grep 那些包含子字符串“ABC”的行,然后在选择的行中提取(它总是存在)末尾的 Kb 数(模式是“ : %n Kb",其中 %n 是从 0 开始的数字)。最后,我需要将所有值相加以获得应用使用的内存量。

2016-01-14T16:15:01.695Z [INFO] application - ABC 5f18dda7-a30a-44f5-82dd-69d4b5469245: 118 Kb
2016-01-14T16:15:04.535Z [INFO] application - 5f18dda7-a30a-44f5-82dd-69d4b5469245

【问题讨论】:

  • 你已经尝试过了吗?

标签: linux command-line grep sum substring


【解决方案1】:

grep 不是动词,但awk 是!

awk '/ABC/ {s+= $(NF-1)} END {print s "Kb"}'

应该可以工作(未经测试)

【讨论】:

  • awk 确实是这样。你能解释一下动词这个词在这种情况下是什么意思吗?我没能在这种情况下翻译它。
  • 我的意思是在“我只需要对那些行进行 grep...”这句话中使用“grep”作为动词会导致 OP 错过明显的解决方案。 'grep' 通常用作常用动词,但 'awk' 很少使用,我认为这是一种讽刺。
  • 有趣的解释! :) 借调!
【解决方案2】:

您可以使用以下链:

grep ABC logfile.txt | egrep -o "[0-9]+ Kb" | cut -f1 -d" "|  paste -s -d+ | bc

【讨论】:

  • 即使“kb 字段”不在末尾也可以使用。
  • @HordonFreeman 做` ... |粘贴 -s -d+ - | bc ` 工作(即,为标准输入添加额外的破折号?)。您使用什么版本的粘贴(粘贴 --version)?您可能需要 coreutils 中的这个 GNU 粘贴,因为其他可能不直接从标准输入读取。
【解决方案3】:

我只需要 grep 那些包含子字符串“ABC”的行,然后在选定的行中提取(它总是存在)末尾的 Kb 数

这看起来像是 awk 的工作。数字始终是倒数第二列,awk 可以轻松提取:

awk '/ABC/ { print $(NF-1) }' filename_here

这里NF-1 是倒数第二列的索引,$ 获取该列中的值。

但是你想总结一下,而不是仅仅提取。这是一个简单的任务,它展示了awk 的更高级用法:

awk '
    BEGIN { sum = 0; }
    /ABC/ { sum += $(NF-1); }
    END { print sum; }
' filename_here

从技术上讲,您可以省略整个 BEGIN 行,但我认为提前了解您希望在程序中使用的变量是一种很好的方式。

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 2017-03-21
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多