首页 > 解决方案 > awk 命令读取日志文件并在日志条目中添加值

问题描述

我正在运行以下命令来扫描日志文件并打印出包含我指定的模式的行。在打印输出行的末尾,这行代码还提供了输出末尾的行数(具有模式)。

awk 'BEGIN{count=0} /error/ && /database/ {print ; count++ } END { print count }' ${LOGFILE}

日志文件内容类似于以下内容:

Sep 25 20:18:21 accountsd[377]: notify name LTNCY=200 "SYDRemotePreferencesSourceDidChangeExternally" has been registered 120 times - this may be a leak 
Sep 25 20:18:21 accountsd[377]: notify name LTNCY=200 "com.apple.syncdefaultsd.daemon.wake" has been registered 120 times - this may be a leak

我遇到的麻烦是,我有一个需要考虑的新情况。

  1. 我还需要确保线条包含模式LTNCY=
  2. 获取包含LTNCY模式的行数
  3. 然后我需要LTNCY从每个日志行中获取每个值的所有值
  4. 将第 3 步中的所有 LTNCY 值相加,然后除以第 2 步

我做到了这一点:

awk 'BEGIN{count=0} /notify.*LTNCY=/ && /may be a leak/ {print ; count++ } END { print count }' ${LOGFILE}

我知道需要使用以下命令的变体:

awk  '{sum+=$1} END {print sum}'

但是我无法将所有内容组合到一个 awk 命令中。

标签: bashawk

解决方案


请您尝试以下操作。

awk '
/LTNCY/{
  count++
  match($0,/LTNCY=[^ ]*/)
  sum+=substr($0,RSTART+6,RLENGTH-6)+0
}
END{
  print "Sum of LTNCY value is:" sum ORS "Total count of LTYNCY is:" count ORS "Their divide is:" sum/count
}
'  Input_file

推荐阅读