获取多个目录下字符串所有出现次数的组合计数?

获取多个目录下字符串所有出现次数的组合计数?

我有一个(希望)有趣的问题,我可以提供一些建议。我有一个主要用于存储日志的系统。它的目录结构如下:

YYYY/MM/DD/hostname/

有许多主机名,每个主机名下面都有一堆压缩的每小时日志(访问、错误等)。

我感兴趣的是访问日志中给定字符串的总数(按日期和主机名细分)。最好的方法是什么?这是否可以通过 find 和 grep 组合来实现,或者是否太复杂而需要一个脚本?

答案1

for d in */*/*/*; do
  printf '%s: ' "$d"
  zcat -- "$d/"*.gz | grep -Fc STRING
done

会计算包含 STRING 的行数。

替换grep -Fc STRINGgrep -Fo STRING | wc -l(假设 GNU grep)以获得出现次数。

如果您不支持文件,请替换zcat为。gzip -dczcat.gz

使用zshGNU grep,您可以将其缩短为:

for d (*/*/*/*) zcat $d/*.gz | grep -FcH --label=$d STRING

答案2

如果您想在没有标准日志分析器的情况下执行此操作,则可以在包含 YYYY 目录的目录中的 shell 的“单行”中执行此操作:

for d in */*/*; do 
  echo -n "$d : "
  find $d -name *.log | xargs grep -c STRING
done

相关内容